MQL4 ve MQL5'te Rakamları () atlayarak herhangi bir sayıdan (sadece tırnak işaretleri değil) sonra ondalık basamak sayısını alma - sayfa 7

 

Habré ile ilgili bir makaleye dayanmaktadır: 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);
  }
//+------------------------------------------------------------------+

gerçekten test etmedim, ama işe yarıyor gibi görünüyor

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

Habré ile ilgili bir makaleye dayanmaktadır: https://habr.com/company/xakep/blog/257897/

gerçekten test etmedim, ama işe yarıyor gibi görünüyor

0.07 sayısının doğru sonucunu veriyorsa, doğru çalışıyor.

 
Alexey Viktorov :

0.07 sayısının doğru sonucunu veriyorsa, doğru çalışıyor.

çalışmıyor ((((

 
Igor Makanu :

çalışmıyor ((((

Ve hiçbir algoritma çalışmayacak...

 
Alexey Viktorov :

Ve hiçbir algoritma çalışmayacak...

olacaktır, ancak sorun verilen doğrulukta ve yüksek hesaplama maliyetlerinin uygunluğunda, çift kesinlikli sayı herhangi bir biçime dönüştürülebilir: ± işareti · (1+mantis/ 2 52 ) × 2 sıra − 1023

mantis ve sırayı ayırmak zor değil, ancak bu sorunu kafa kafaya çözmek ilginç değil

 
Igor Makanu :

olacaktır, ancak sorun verilen doğrulukta ve yüksek hesaplama maliyetlerinin uygunluğunda, çift kesinlikli sayı herhangi bir biçime dönüştürülebilir: ± işareti · (1+mantis/ 2 52 ) × 2 sıra − 1023

mantis ve sırayı ayırmak zor değil, ancak bu sorunu kafa kafaya çözmek ilginç değil

Doğruluk verilirse, tüm bu girişimin bir anlamı yoktur. Ben zaten bir örnek verdim, 0.07'nin iki ondalık basamağı var. Ancak, karakter sayısını programlı olarak hesaplamaya çalışırsak, on üç parça elde ederiz ... Ve 0,07 hesaplamalar sonucu elde edilmez, bir değişken aracılığıyla bile manuel olarak girilmez.

 

Başka bir seçenek var:

 #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 :

Kendine gel. Bu, ciddiyetle tartışılmaması gereken bir saçmalıktır.

Yazar, çift değişkenlerin iç yapısını tamamen yanlış anlamıştır.

Ö!

 
Alexandr Sokolov :
Her şeyi bildiğimi iddia etmedim, bana hatanın ne olduğunu söylemen veya kendi versiyonunu göstermen daha iyi

Programınızdaki her bir çift değişken için kaç ondalık basamak tanımlandığını bilmek istiyorsunuz. Bu saçmalık. Tüm çift değişkenler aynı temsile sahiptir. Float formatında sunulurlar. Bazen nokta solda, bazen sağda - sayının değerine bağlıdır. Bir milyon ve bir milyonda biri farklı hassasiyetle temsil edilir.

 
Konstantin Gruzdev :

Başka bir seçenek var:

hayır, işe yaramayacak, dün tür dönüştürme ile yaptım, işte senaryo, sizin örneğiniz ve benimki:

 #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));
  }

Sonuçlar:

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

2018.11.13 01:49:16.131 tst (EURUSD,M30) 1. Rakam() = 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. Rakam() = 3



google FP- Printing -PLDI96.pdf yapabilirsiniz , ancak birisinin her şeyi algoritmaya göre yapacağından şüpheliyim