MQL4 및 MQL5에서 Digits()를 무시하고 숫자(따옴표 제외)의 쉼표 뒤 소수 자릿수 가져오기 - 페이지 12

 
Ilya Malev :

이것이 아마도 최선의 해결책일 것입니다

특히 작업이 정확히 부호에 달려 있기 때문에 평등에 대해 double을 비교하는 것은 올바르지 않습니다.

MT4 파일 stdlib.mq4를 보면 올바른 이중 비교의 예가 있습니다.

비교Doubles()

추신: 주제에 따르면 https://www.mql5.com/ru/articles/1561 기사가 있습니다.

Особенности работы с числами типа double в MQL4
Особенности работы с числами типа double в MQL4
  • www.mql5.com
При программировании на языке MQL4 у новичков порой возникают ситуации, когда результаты некоторых математических вычислений отличаются от ожидаемых. При этом программа компилируется и работает, но не так, как нужно. Они начинают разбираться в программе, находят новые "ошибки" в языке, реализации функций и т.п. В большинстве случаев последующий...
 
Aliaksandr Hryshyn :
로그, 정수가 아닌 숫자에 의한 지수 계산, 삼각법 사용, .... 타사 라이브러리, 표시기 사용 ... 모두 오류가 있습니다!

초 메가 정밀도가 절실히 필요한 경우 gnu mp와 같은 특수 외부 라이브러리를 사용합니다.

그렇지 않고 보장된 정확도가 필요한 경우(각 작업 중에 오류도 계산되는 경우) 모든 종류의 "간격 라이브러리"를 사용합니다.

이것이 충분하지 않더라도 숫자 대신 다항식을 사용합니다.

그러나 나는 그러한 펜이 MT에서 실제로 수요가 있었던 경우를 본 적이 없습니다 :-)

여기에 눈을 위해 두 번 :-)

 
Igor Makanu :

특히 작업이 정확히 부호에 달려 있기 때문에 평등에 대해 double을 비교하는 것은 올바르지 않습니다.

MT4 파일 stdlib.mq4를 보면 올바른 이중 비교의 예가 있습니다.

비교Doubles()

글쎄요, 그리고 CompareDoubles의 실행 시간은 2번 걸립니다. 그러면 다음과 같이 더 좋습니다.

 int dtd( double f)
 {
  f/= 0.0000001 ;
 
   if ( int ( fmod (f, 10000000 ))== 0 )
   {
     return 0 ;
   }
   if ( int ( fmod (f, 1000000 ))== 0 )
   {
     return 1 ;
   }
   if ( int ( fmod (f, 100000 ))== 0 )
   {
     return 2 ;
   }
   if ( int ( fmod (f, 10000 ))== 0 )
   {
     return 3 ;
   }
   if ( int ( fmod (f, 1000 ))== 0 )
   {
     return 4 ;
   }
   if ( int ( fmod (f, 100 ))== 0 )
   {
     return 5 ;
   }
   if ( int ( fmod (f, 10 ))== 0 )
   {
     return 6 ;
   }
   return 7 ;
 }
 
Ilya Malev :

글쎄요, 그리고 CompareDoubles의 실행 시간은 2번 걸립니다. 그러면 다음과 같이 더 좋습니다.

우리는 올바른 계산에 대해 이야기하고 있습니다. 지금 코드를 확인할 수는 없지만 어렵지 않습니다. 루프에서 DoubleToStr()을 사용하는 예제와 예제를 비교해야 합니다. 차이점이 없으면 모든 것이 올바른 것입니다.

추신: fmod()로 시도했는데 예를 든 것 같습니다. 제대로 작동하지 않습니다. 0.07을 확인해야 하는 것 같습니다. 버그가 즉시 나타납니다.

 
Igor Makanu :

우리는 올바른 계산에 대해 이야기하고 있습니다. 지금 코드를 확인할 수는 없지만 어렵지 않습니다. 루프에서 DoubleToStr()을 사용하는 예제와 예제를 비교해야 합니다. 차이점이 없으면 모든 것이 올바른 것입니다.

나는 이미 속도를 확인하고 계산했습니다. 가장 성공적인 옵션이 나옵니다. 물론 7자 이상은 볼 필요가 없다면 말이다.

Z.s. 0.7 및 0.07 및 500000000.0001 등 모든 것이 정확합니다.

Z.z.s. 그러나 500000000.9991에서는 더 나빠집니다. 그러나 실제로 외환은 거의 중요하지 않습니다.

 
Ilya Malev :

그러나 실제로 외환은 거의 중요하지 않습니다.

작업에 따라 다르며 거래 주문 의 경우 이 작업이 전혀 의미가 없습니다.

수학적 모델링 작업이 있으면 편리할 수 있습니다. 글쎄, 그들은 double의 아름다운 출력을 위해 정확히 작업이 있었다고 위에 썼습니다.

 
Igor Makanu :

작업에 따라 다르며 거래 주문 의 경우 이 작업이 전혀 의미가 없습니다.

수학적 모델링 작업이 있으면 편리할 수 있습니다. 글쎄, 그들은 double의 아름다운 출력을 위해 정확히 작업이 있었다고 위에 썼습니다.

음, 물론 신경망은 쓰지 마세요 =)) 하지만 가격/제비/돈을 소수점 표시기가 있는 4바이트 정수로 저장하여 데이터 양을 2배 줄이는 것이 편리하다고 가정해 보겠습니다.

 
Igor Makanu :

특히 작업이 정확히 부호에 달려 있기 때문에 평등에 대해 double을 비교하는 것은 올바르지 않습니다.

MT4 파일 stdlib.mq4를 보면 올바른 이중 비교의 예가 있습니다.

비교Doubles()

추신: 주제에 따르면 https://www.mql5.com/ru/articles/1561 기사가 있습니다.

따라서 작업은 가치가 있습니다. x가 정규화되는 문자 수를 결정하는 것입니다. 그래서 모든 것이 괜찮습니다. 그런 사다리를 작성하는 것이 너무 게으르지 않았다는 것을 제외하고.

 
Dmitry Fedoseev :

그런 사다리를 작성하는 것이 너무 게으르지 않았다는 것을 제외하고.

사다리 없이는 가능하며 시간이 10%만 더 걸립니다.

 int dtd2( double f)
 {
  f/= 0.0000001 ;
   int d = 0 , i = 10000000 ;
 
   while ( d < 7 && int ( fmod ( f, i ) ) > 0 )
   {
    i /= 10 ;
    d ++ ;
   }

   return d ;
 }
 
Ilya Malev :

사다리 없이는 가능하며 시간이 10%만 더 걸립니다.

여기 있습니다: f/=0.0000001; 의문을 제기합니다.