Erreurs, bugs, questions - page 2623

 
Vladimir Pastushak:

Des mathématiques assez divertissantes

Résultat

2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.06000000 0.01 6.00 Prochain lot = 0.06999999999999999
2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.06000000 0.01 6.00 Prochain lot = 0.0699999999999999999
2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.06000000 0.01 6.00 Prochain lot = 0.0699999999999999999
2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.06000000 0.01 6.00 Prochain lot = 0.069999999999999
2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.06000000 0.01 6.00 Lot suivant = 0.069999999999999 As 0.06000000 + 0.01 devient 0.069999999999999999999
2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.05000000 0.01 5.00 Prochain lot = 0.06
2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.04000000 0.01 4.00 Prochain lot = 0.05
2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.03000000 0.01 3.00 Prochain lot = 0.04
2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.02000000 0.01 2.00 Prochain lot = 0.03
2020.01.05 17:09:28.798 Testert EURUSD,H1 : 0.01000000 0.01 1.00 Prochain lot = 0.02


Pourquoi utiliser la fonction MathFloor (Renvoie la valeur entière la plus proche du bas) pour les nombres fractionnaires (double)?
 
Nikolai Semko:

Cette question revient souvent.

cool ! vous êtes somnambule sur internet, mais pouvez-vous répondre à la question "où est passée la dernière itération" ? ;) dans cet exemple :

void OnStart()
{
   for(double x = 10.0; x <= 20.0; x += 0.1) {
      printf("x = %10.60f", x);
      Sleep(111);
   }
}

2020.01.06 01:26:11.016 tst_double (EURUSD,H1) x = 10,0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:26:11.127 tst_double (EURUSD,H1) x = 10.0999999999999996447286321199949907064437866210937500000000000

2020.01.06 01:26:11.239 tst_double (EURUSD,H1) x = 10.199999999999999289457264239899814128875732421875000000000000

2020.01.06 01:26:11.350 tst_double (EURUSD,H1) x = 10.29999999999999893434185896359849721193313598632812500000000000

2020.01.06 01:26:11.462 tst_double (EURUSD,H1) x = 10.3999999999999999998589145284797996282577514648437500000000000

2020.01.06 01:26:11.574 tst_double (EURUSD,H1) x = 10.49999999999999998223643160599749535322189331054687500000000000

2020.01.06 01:26:11.686 tst_double (EURUSD,H1) x = 10,5999999999999978968371792719699442386627197265625000000000000

2020.01.06 01:26:11.798 tst_double (EURUSD,H1) x = 10.6999999999999999997597513100424839649349451065063476562500000000000

2020.01.06 01:26:11.910 tst_double (EURUSD,H1) x = 10.7999999999999999715999715782905695992565155029296875000000000000

2020.01.06 01:26:12.022 tst_double (EURUSD,H1) x = 10.899999999999996998025579079549163579940795898437500000000000

2020.01.06 01:26:12.134 tst_double (EURUSD,H1) x = 10.999999999999964472863211994990706443786621093750000000000

2020.01.06 01:26:12.246 tst_double (EURUSD,H1) x = 11.0999999999999960920194953319448977708816528320312500000000000

2020.01.06 01:26:12.358 tst_double (EURUSD,H1) x = 11.19999999999999995957954355678543988847732543945312500000000000

2020.01.06 01:26:12.470 tst_double (EURUSD,H1) x = 11.2999999999999999995381472217559348791837692260742187500000000000

2020.01.06 01:26:12.582 tst_double (EURUSD,H1) x = 11.399999999999995095026200849679298698902130126953125000000000000

2020.01.06 01:26:12.695 tst_double (EURUSD,H1) x = 11.4999999999999994670929481799248605966567993164062500000000000

2020.01.06 01:26:12.808 tst_double (EURUSD,H1) x = 11.59999999999999999431565811391919851303100585937500000000000

2020.01.06 01:26:12.920 tst_double (EURUSD,H1) x = 11.699999999999999939939603867460391484200200443725585937500000000000

2020.01.06 01:26:13.032 tst_double (EURUSD,H1) x = 11.799999999999999936051153781590983271598815917968975000000000000

2020.01.06 01:26:13.143 tst_double (EURUSD,H1) x = 11.899999999999999932949844010279048234224319458007812500000000000

2020.01.06 01:26:13.254 tst_double (EURUSD,H1) x = 11.999999999999992894572642398998141288757324218750000000

2020.01.06 01:26:13.367 tst_double (EURUSD,H1) x = 12.0999999999999999992539301274518948048353195190429687500000000000

2020.01.06 01:26:13.478 tst_double (EURUSD,H1) x = 12.1999999999992999218402990663889754176330566406250000000000000000

2020.01.06 01:26:13.590 tst_double (EURUSD,H1) x = 12.29999999999999991828758538758847862482070922851562500000000000

2020.01.06 01:26:13.702 tst_double (EURUSD,H1) x = 12.39999999999999999991473487170879777795695465087890625000000000000

2020.01.06 01:26:13.813 tst_double (EURUSD,H1) x = 12.499999999999991191118215802998747676610946655273437500000000000

2020.01.06 01:26:13.925 tst_double (EURUSD,H1) x = 12,59999999999999990762944435118697583675384521484375000000000000

2020.01.06 01:26:14.037 tst_double (EURUSD,H1) x = 12.6999999999999909040767306723864749073982238769531250000000

2020.01.06 01:26:14.149 tst_double (EURUSD,H1) x = 12.79999999999999990090052401699358597397804260253906250000000000000

2020.01.06 01:26:14.261 tst_double (EURUSD,H1) x = 12.8999999999999998989697130331478547304868698120117187500000000000

2020.01.06 01:26:14.372 tst_double (EURUSD,H1) x = 12.99999999999998934341858963598497211933135986328125000000000000

2020.01.06 01:26:14.483 tst_double (EURUSD,H1) x = 13.0999999999999889889865875957184471189975738539062500000000000

2020.01.06 01:26:14.596 tst_double (EURUSD,H1) x = 13.19999999999999988631316227838393970260620117187500000000000000000000

2020.01.06 01:26:14.707 tst_double (EURUSD,H1) x = 13.2999999999999889276044859958346933126449584960937500000000000

2020.01.06 01:26:14.820 tst_double (EURUSD,H1) x = 13.39999999999999987920773492078296840190887451171875000000000000

2020.01.06 01:26:14.932 tst_double (EURUSD,H1) x = 13.499999999999999875502124198246747532531738281250000000

2020.01.06 01:26:15.044 tst_double (EURUSD,H1) x = 13.5999999999999999987281023027563181966543197631835937500000000000

2020.01.06 01:26:15.157 tst_double (EURUSD,H1) x = 13.69999999999999986854959388438146561380104249804687500000000000

2020.01.06 01:26:15.270 tst_double (EURUSD,H1) x = 13.7999999999999999986499688020558096468448638916015625000000000000

2020.01.06 01:26:15.381 tst_double (EURUSD,H1) x = 13.8999999999999998699144416652678046375513076782226562500000000000

2020.01.06 01:26:15.493 tst_double (EURUSD,H1) x = 13.999999999999985789178914528479762998257751464843750000000000

2020.01.06 01:26:15.604 tst_double (EURUSD,H1) x = 14.099999999999985985433873916917946189641952514648437500000000000

2020.01.06 01:26:15.717 tst_double (EURUSD,H1) x = 14.19999999999998508786025490378960967063903808593750000000000000000

2020.01.06 01:26:15.828 tst_double (EURUSD,H1) x = 14.299999999999999849723331181157846003770708282470312500000000000

2020.01.06 01:26:15.941 tst_double (EURUSD,H1) x = 14.3999999999999849999843680598132777959108352661132812500000000000

2020.01.06 01:26:16.054 tst_double (EURUSD,H1) x = 14.49999999999849984012788445397745817899703979492187500000000000

2020.01.06 01:26:16.167 tst_double (EURUSD,H1) x = 14.5999999999999998399657517077517695724964141845703125000000000000

2020.01.06 01:26:16.280 tst_double (EURUSD,H1) x = 14.699999999999999838330224545709637645632028579711914062500000000000

2020.01.06 01:26:16.393 tst_double (EURUSD,H1) x = 14.799999999999999998294694743417575955390930175781250000000

2020.01.06 01:26:16.504 tst_double (EURUSD,H1) x = 14.899999999999999899825917092973877545446157455444335937500000000000

2020.01.06 01:26:16.615 tst_double (EURUSD,H1) x = 14.99999999999822364316059974953532218933105468750000000000000000

2020.01.06 01:26:16.728 tst_double (EURUSD,H1) x = 15.0999999999999999981881160238117445260286331176757812500000000000

2020.01.06 01:26:16.841 tst_double (EURUSD,H1) x = 15.1999999999999898151525888870237395167373507690429687500000000000

2020.01.06 01:26:16.953 tst_double (EURUSD,H1) x = 15.299999999999999811706175023573450744152069091796897500000000000

2020.01.06 01:26:17.066 tst_double (EURUSD,H1) x = 15.3999999999999998080815346134477294981479644775390625000000000000

2020.01.06 01:26:17.179 tst_double (EURUSD,H1) x = 15.49999999999998080460074766597244888544082641601562500000000000

2020.01.06 01:26:17.290 tst_double (EURUSD,H1) x = 15.5999999999999998010480339871719479560852050781250000000000000000

2020.01.06 01:26:17.402 tst_double (EURUSD,H1) x = 15.69999999999999979749749532030837144702672958374023437500000000000

2020.01.06 01:26:17.514 tst_double (EURUSD,H1) x = 15.799999999999999797939424260662957094609737393962402343750000000000000000

2020.01.06 01:26:17.627 tst_double (EURUSD,H1) x = 15.899999999999999790938989295077044516801834106445312500000000000

2020.01.06 01:26:17.740 tst_double (EURUSD,H1) x = 15.9999999999999783737179271961944238662719726562500000000000

2020.01.06 01:26:17.851 tst_double (EURUSD,H1) x = 16.0999999999999801048033987171947956085205078125000000000000

2020.01.06 01:26:17.964 tst_double (EURUSD,H1) x = 16.199999999999981599815258870237395167373507690429687500000000000

2020.01.06 01:26:18.076 tst_double (EURUSD,H1) x = 16.2999999999999998982946947434175759553909301757812500000000000

2020.01.06 01:26:18.189 tst_double (EURUSD,H1) x = 16.399999999999999848499843680598132777959108352661132812500000000000

2020.01.06 01:26:18.302 tst_double (EURUSD,H1) x = 16.49999999999999985999985789178914528479799626282577514648437500000000000000

2020.01.06 01:26:18.414 tst_double (EURUSD,H1) x = 16.5999999999999998721023075631819665431976318359375000000000

2020.01.06 01:26:18.526 tst_double (EURUSD,H1) x = 16.69999999999999988631316227838397026062011718750000000000000000

2020.01.06 01:26:18.638 tst_double (EURUSD,H1) x = 16.79999999999999990090052401699358597397804260253906250000000000000

2020.01.06 01:26:18.750 tst_double (EURUSD,H1) x = 16.89999999999999999991473487170878797777956954650878906250000000000

2020.01.06 01:26:18.861 tst_double (EURUSD,H1) x = 16.999999999999992894597264239899814128875732421875000000000

2020.01.06 01:26:18.973 tst_double (EURUSD,H1) x = 17.0999999999999999431565811391919851303100585937500000000000

2020.01.06 01:26:19.085 tst_double (EURUSD,H1) x = 17.19999999999999999957395795435854398884773254394531250000000000000

2020.01.06 01:26:19.197 tst_double (EURUSD,H1) x = 17.29999999999999997157829056959599256515502929687500000000000000

2020.01.06 01:26:19.309 tst_double (EURUSD,H1) x = 17.39999999999999998597891452847979962825775146484375000000000

2020.01.06 01:26:19.420 tst_double (EURUSD,H1) x = 17.50000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:26:19.532 tst_double (EURUSD,H1) x = 17.60000000000000142108547152020037371742248535156250000000000000

2020.01.06 01:26:19.644 tst_double (EURUSD,H1) x = 17.70000000000000002842170943040400743434449703125000000000000000000

2020.01.06 01:26:19.757 tst_double (EURUSD,H1) x = 17.80000000000000426363256414560601115226745605468750000000000000

2020.01.06 01:26:19.870 tst_double (EURUSD,H1) x = 17.9000000000005684341886080801486968994140625000000000000000

2020.01.06 01:26:19.982 tst_double (EURUSD,H1) x = 18.000000000071054273576010018587112475781250000000000000

2020.01.06 01:26:20.093 tst_double (EURUSD,H1) x = 18.100000000000008526512829121202230453491210937500000000000000

2020.01.06 01:26:20.205 tst_double (EURUSD,H1) x = 18.200000000000009947598300641402602195739746093750000000000000

2020.01.06 01:26:20.316 tst_double (EURUSD,H1) x = 18.30000000000001136868377216160297393798828125000000000000000000

2020.01.06 01:26:20.429 tst_double (EURUSD,H1) x = 18.400000000001278976924368180334568023681640625000000000000000

2020.01.06 01:26:20.542 tst_double (EURUSD,H1) x = 18.50000000014210854715202003717422485351562500000000000000

2020.01.06 01:26:20.653 tst_double (EURUSD,H1) x = 18.600000000000015631940186722204089164733886718750000000000000

2020.01.06 01:26:20.764 tst_double (EURUSD,H1) x = 18.7000000000017053052565824240446090698242187500000000000

2020.01.06 01:26:20.877 tst_double (EURUSD,H1) x = 18.800000000184741111297626260483264923095703125000000000

2020.01.06 01:26:20.989 tst_double (EURUSD,H1) x = 18.900000000000019895196601282805204391479492187500000000000000

2020.01.06 01:26:21.101 tst_double (EURUSD,H1) x = 19.00000000000002131616282072803003005576133728027343750000000000000

2020.01.06 01:26:21.213 tst_double (EURUSD,H1) x = 19.10000000000227373675444432320594789775976562500000000000000000

2020.01.06 01:26:21.326 tst_double (EURUSD,H1) x = 19.20000000024158453015843406319618225097656250000000000000

2020.01.06 01:26:21.438 tst_double (EURUSD,H1) x = 19.3000000000025579538487363609669136047363232812500000000000000

2020.01.06 01:26:21.551 tst_double (EURUSD,H1) x = 19.400000000000027623958883807063102722167968750000000000000

2020.01.06 01:26:21.664 tst_double (EURUSD,H1) x = 19.5000000000028421709430304040074343444970703125000000000000000

2020.01.06 01:26:21.776 tst_double (EURUSD,H1) x = 19.60000000000000029842794901924207806587219238282812500000000000

2020.01.06 01:26:21.887 tst_double (EURUSD,H1) x = 19.7000000000000312126386808037344440817832946773437500000000000000

2020.01.06 01:26:22.000 tst_double (EURUSD,H1) x = 19.8000000000032684949844964608550071716308593750000000000000

2020.01.06 01:26:22.112 tst_double (EURUSD,H1) x = 19.9000000003410605131648480892181396484375000000000000000000



Sérieusement, je veux comprendre et expliquer où est passée la 20.0 ?

 
Igor Makanu:

cool ! vous êtes somnambule sur internet, mais pouvez-vous répondre à la question "où est passée la dernière itération" ? ;) dans cet exemple :

Plus sérieusement, je veux comprendre et expliquer où est passée la 20.0 ?

Eh bien, c'est assez simple :

0,1 dans le type double est en réalité 0,100000000000000000055511151231257827021181583404541015625, c'est-à-dire plus que 0,1

par conséquent ? au dernier contrôle, il sera déjà supérieur à 20, plus précisément 10+100*0,1000000000000000000000055511151231257827021181583404541015625 ~ 20,00000000000000000000555111512312578

et le cycle se termine

et si nous faisons cette expérience :

void OnStart() {
   for(double x = 0.0; x <= 1.0; x += 0.01) {
      printf("x = %10.60f", x);
   }
}

puis le résultat de la dernière itération :

2020.01.05 16:51:40.480 TestDouble (EURUSD,M1)  x = 0.970000000000000639488462184090167284011840820312500000000000
2020.01.05 16:51:40.480 TestDouble (EURUSD,M1)  x = 0.980000000000000648370246381091419607400894165039062500000000
2020.01.05 16:51:40.480 TestDouble (EURUSD,M1)  x = 0.990000000000000657252030578092671930789947509765625000000000

Mais si nous changeons double en float, le résultat sera :

2020.01.05 16:53:06.926 TestDouble (EURUSD,M1)  x = 0.979999363422393798828125000000000000000000000000000000000000
2020.01.05 16:53:06.926 TestDouble (EURUSD,M1)  x = 0.989999353885650634765625000000000000000000000000000000000000
2020.01.05 16:53:06.926 TestDouble (EURUSD,M1)  x = 0.999999344348907470703125000000000000000000000000000000000000

parce que 0,01 pour le double est supérieur à 0,01, et pour le float est inférieur à

 
Nikolai Semko:

C'est aussi simple que cela :

0.1 dans le type double est en réalité 0.1000000000000005511151231257827021181583404541015625, c'est-à-dire plus grand que 0.1

donc ? au dernier contrôle, il sera déjà plus de 20, plus précisément 10+100*0,1000000000000000000000055511151231257827021181583404541015625 ~ 20,000000000000000000000555111512312578

et le cycle se termine

OK, je l'ai.

Oui, la boucle for() va itérer et comparer la condition, le problème est résolu.

vous pouvez montrer ce code à titre d'exemple :

void OnStart()
{
   for(int x = 10; x <= 20; x += 1) {
      printf("x = %10.60f", x);
      Sleep(111);
   }
}

2020.01.06 01:48:50.513 tst_double (EURUSD,H1) x = 10.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:50.642 tst_double (EURUSD,H1) x = 11.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:50.767 tst_double (EURUSD,H1) x = 12.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:50.892 tst_double (EURUSD,H1) x = 13.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:51.017 tst_double (EURUSD,H1) x = 14.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:51.142 tst_double (EURUSD,H1) x = 15.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:51.267 tst_double (EURUSD,H1) x = 16.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:51.392 tst_double (EURUSD,H1) x = 17.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:51.517 tst_double (EURUSD,H1) x = 18,000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:51.642 tst_double (EURUSD,H1) x = 19.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

2020.01.06 01:48:51.767 tst_double (EURUSD,H1) x = 20.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


comme prévu, la boucle s'est arrêtée lorsqu'elle a atteint 20

 
Nikolai Semko:

C'est une question qui revient tout le temps.
Tout le monde parle toujours de la norme IEEE 754, mais souvent, lorsque les gens vont sur wikipedia - soit à cause de la complexité, soit par paresse, ils repartent sans avoir compris la signification de la norme.

Je vais prendre un peu de temps pour essayer d'expliquer cette norme aussi brièvement que possible et avec des mots simples, afin de pouvoir se référer à ce post à l'avenir.

Je vous remercie, du fond du cœur ! Merci !

On peut se référer à ce message non seulement comme au fonctionnement des chiffres doubles, mais aussi comme un exemple, une réponse compétente et compréhensible pour l'utilisateur, sans envoyer de googler.

 
Igor Makanu:

Donc, vous suggérez que ceux qui postent sur le Marché devraient être ignorés ? Je ne suis pas sûr que je voudrais faire ça, il y a eu une question, une discussion, je pense que c'est une situation normale.

PS :

en plus de cela .... essayez de désimprimer un double via printf(), j'ai le sentiment qu'il y aura beaucoup de "combien de découvertes merveilleuses l'esprit des lumières nous prépare-t-il...".

;)

Je n'ai rien suggéré ni appelé personne à quoi que ce soit. Je pense simplement que vous devriez lire plus souvent sur le forum, non seulement ce que vous avez écrit vous-même, mais aussi ce que les autres ont écrit. Surtout si des personnes vraiment inexpérimentées posent des questions. Car c'est dans ces questions et réponses que l'on peut apprendre beaucoup de choses sur soi-même. Vous pouvez même trouver une réponse à la question qui ne vous est même pas venue à l'esprit. J'ai personnellement apprisbeaucoup plus tôt l'existence de cette norme IEEE 754, en lisant simplement les questions des débutants. De vrais débutants... C'est le message qui était adressé à Vladimir en réponse à vous.

 
Alexey Viktorov:

Je n'ai rien suggéré ni appelé personne à quoi que ce soit. Je pense simplement que vous devriez lire plus souvent sur le forum, non seulement ce que vous avez écrit vous-même, mais aussi ce que les autres ont écrit. Surtout si des personnes vraiment inexpérimentées posent des questions. Car c'est dans ces questions et réponses que l'on peut apprendre beaucoup de choses sur soi-même. Vous pouvez même trouver une réponse à la question qui ne vous est même pas venue à l'esprit. J'ai personnellement apprisbeaucoup plus tôt l'existence de cette norme IEEE 754, en lisant simplement les questions des débutants. De vrais débutants... C'est le message qui était adressé à Vladimir en réponse à vous.

Je vais ajouter mes 5 centimes. Tout est IMHO. Il est très étrange de faire plus d'une année de programmation et de ne pas étudier la base, alors que les mathématiques des nombres à virgule flottante sont exactement la base. Ainsi, seuls les quais et les normes sauveront les pères de la démocratie russe (et pas seulement). Fumez-les de façon réfléchie.
 
Vladimir Pastushak:

Je vous remercie, du fond du cœur ! Merci !

Vous pouvez vous référer à ce post non seulement comme au fonctionnement des nombres doubles, mais aussi comme un exemple, d'une réponse compétente et compréhensible à un utilisateur, sans envoi de google.

Vous êtes les bienvenus :)

 

Je ne cherche pas souvent les codes de flèches, mais ils sont incroyablement difficiles à trouver dans l'aide !

C'est un tableau avec des astérisques, des cercles, etc.

Et la recherche renvoie tout sauf le bon !

 
Михаил:

Je ne cherche pas souvent les codes de flèches, mais ils sont incroyablement difficiles à trouver dans l'aide !

C'est un tableau avec des astérisques, des cercles, etc.

Et la recherche renvoie tout sauf le bon !

Wingdings