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

 

Habré에 대한 기사 기반: https://habr.com/company/xakep/blog/257897/

 #property copyright "IgorM"
#property link        "https://www.mql5.com/ru/users/igorm"
#property version    "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   double a= 1.123456 ;
   Print (DoubleToDigits(a));
  }
//+------------------------------------------------------------------+
int DoubleToDigits( double value)
  {
   const double digits[ 18 ]={ 1 e17, 1 e16, 1 e15, 1 e14, 1 e13, 1 e12, 1 e11, 1 e10, 1 e9, 1 e8, 1 e7, 1 e6, 1 e5, 1 e4, 1 e3, 1 e2, 1 e1, 1.0 };
   double absvalue= fabs (value);
   int i,decimal=( int )absvalue;
   double real= floor ((absvalue-decimal)* 1 e18+ 0.5 )- 0.5 ;
   double normalize= fmod (real, 1 e3);
   if (normalize> 0.0 )
     {
       if (normalize> 51.5 ) real+= 1 e3-normalize; else real-=normalize;
     }
   double res,last= 0.0 ;
   for (i= 0 ;i< 18 ;i++)
     {
      res=real- fmod (real,digits[i]);
       if (last-res>= 0.0 ) break ; else last=res;
     }
   return (i);
  }
//+------------------------------------------------------------------+

실제로 테스트하지는 않았지만 작동하는 것 같습니다

Всё, точка, приплыли! Учимся работать с числами с плавающей точкой и разрабатываем альтернативу с фиксированной точностью десятичной дроби
Всё, точка, приплыли! Учимся работать с числами с плавающей точкой и разрабатываем альтернативу с фиксированной точностью десятичной дроби
  • habr.com
Сегодня мы поговорим о вещественных числах. Точнее, о представлении их процессором при вычислении дробных величин. Каждый из нас сталкивался с выводом в строку чисел вида 3,4999990123 вместо 3,5 или, того хуже, огромной разницей после вычислений между результатом теоретическим и тем, что получилось в результате выполнения программного кода...
 
Igor Makanu :

Habré에 대한 기사 기반: https://habr.com/company/xakep/blog/257897/

실제로 테스트 하지는 않았지만 작동하는 것 같습니다

숫자 0.07의 올바른 결과를 제공하면 올바르게 작동합니다.

 
Alexey Viktorov :

숫자 0.07의 올바른 결과를 제공하면 올바르게 작동합니다.

작동하지 않습니다((((

 
Igor Makanu :

작동하지 않습니다((((

그리고 어떤 알고리즘도 작동하지 않을 것입니다 ...

 
Alexey Viktorov :

그리고 어떤 알고리즘도 작동하지 않을 것입니다 ...

하지만 문제는 주어진 정확도와 높은 계산 비용의 편의상 배정밀도 숫자를 다음 형식으로 변환할 수 있다는 점입니다. ± 기호 · (1+가수/ 2 52 ) × 2 차수 − 1023

사마귀와 순서를 구별하는 것은 어렵지 않지만 이 문제를 정면으로 해결하는 것은 흥미롭지 않습니다.

 
Igor Makanu :

하지만 문제는 주어진 정확도 와 높은 계산 비용의 편의상 배정밀도 숫자를 다음 형식으로 변환할 수 있다는 점입니다. ± 기호 · (1+가수/ 2 52 ) × 2 차수 − 1023

사마귀와 순서를 구별하는 것은 어렵지 않지만 이 문제를 정면으로 해결하는 것은 흥미롭지 않습니다.

정확성이 주어진다면 이 전체 작업에 의미가 없습니다. 나는 이미 예를 들었습니다. 0.07에는 소수점 이하 두 자리가 있습니다. 그러나 프로그래밍 방식으로 문자 수를 계산하려고하면 13 조각이 나옵니다. 그리고 0.07은 계산 결과로 얻은 것이 아니라 변수를 통하지 않고 수동으로 입력됩니다.

 

또 다른 옵션이 있습니다.

 #define EPSILON   0.000000001
#define MORE(A,B) ((A)-(B)>EPSILON)

int Digits ( double value)
  {
   int digits= 0 ;
   while (MORE( 1.0 / MathPow ( 10 ,digits),value)) 
      digits++;
   return (digits);
  }
 
Mesaoria :

정신 차리세요. 이것은 심각하게 논의되어서도 안되는 말도 안되는 소리입니다.

저자는 단순히 이중 변수의 내부 구조를 완전히 오해하고 있습니다.

영형!

 
Alexandr Sokolov :
내가 다 안다고 주장하는 것이 아니라 틀린 부분을 말하거나 자신의 버전을 보여주는 것이 좋습니다

프로그램에서 각 이중 변수에 대해 소수 자릿수가 몇 개나 정의되어 있는지 알고 싶습니다. 말도 안되는 소리입니다. 모든 이중 변수는 동일한 표현을 갖습니다. Float 형식으로 표시됩니다. 때로는 포인트가 왼쪽에 있고 때로는 오른쪽에 있습니다. 숫자 값에 따라 다릅니다. 100만분의 1과 100만분의 1은 다른 정밀도로 표시됩니다.

 
Konstantin Gruzdev :

또 다른 옵션이 있습니다.

아니요, 작동하지 않습니다. 어제 유형 변환을 통해 수행했습니다. 여기에 스크립트, 귀하의 예 및 제 것이 있습니다.

 #define EPSILON   0.000000001
#define MORE(A,B) ((A)-(B)>EPSILON)

int Digit( double value)
  {
   int digits= 0 ;
   while (MORE( 1.0 / MathPow ( 10 ,digits),value)) 
      digits++;
   return (digits);
  }
//+------------------------------------------------------------------+
int DoubleToDigits( double value)
 {
   double absvalue= NormalizeDouble ( fabs (value- int (value)), 15 );
   int res= StringLen ( string (absvalue))- 2 ;
   return (res<= 0 ? 0 :res);
 }
//+------------------------------------------------------------------+
void OnStart ()
  {
   double f = 122334550.007 ;
   Print ( "1. DoubleToDigits() = " ,DoubleToDigits(f));
   Print ( "1. Digit() = " ,Digit(f));
   f = 0.007 ;
   Print ( "2. DoubleToDigits() = " ,DoubleToDigits(f));
   Print ( "2. Digit() = " ,Digit(f));
  }

결과:

2018.11.13 01:49:16.131 tst (EURUSD,M30) 1.DoubleToDigits() = 11

2018.11.13 01:49:16.131 tst (EURUSD,M30) 1. 숫자() = 0

2018.11.13 01:49:16.131 tst (EURUSD,M30) 2.DoubleToDigits() = 3

2018.11.13 01:49:16.131 tst (EURUSD,M30) 2. 숫자() = 3



당신은 구글 FP- 인쇄 -PLDI96.pdf 할 수 있지만 누군가가 알고리즘에 따라 모든 것을 할 것인지 의심 스럽습니다.