Ошибки, баги, вопросы - страница 2623

 
Vladimir Pastushak:

Весьма занимательная математика 

Результат

2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.06000000   0.01   6.00  Next lot = 0.06999999999999999    Как 0.06000000 + 0.01  становиться 0.06999999999999999 

Постоянно возникает этот вопрос.
Постоянно все говорят о стандарте IEEE 754, но часто люди, когда заходят в википедию – то ли по причине сложности, то ли по причине лени уходят, так и не поняв смысл этого стандарта.

Я потрачу немного времени, чтобы попробовать объяснить этот стандарт максимально коротко и простыми словами, чтобы в дальнейшем ссылаться на это сообщение.


Итак, тип double состоит из 8 байт = 64 бита. (float 4 байта = 32 бита)

И  представление числа double и float состоит из 3 компонентов: знак (sign), экспонента и мантисса  


DOUBLE:


FLOAT:

Естественно, что в данном формате не существует десятичного представления чисел, а только двоичное.

  • Знак – 1 бит. Если 0 – значит + (плюс), если 1 значит – (минус).
  • Экспонента хранит степень для числа 2. Может быть в диапазоне от -12610 до 12710 для float и от – 1022 10 до 102310 для double
  • Мантисса – дробная часть самого числа в двоичной форме, приведенное к такому виду, чтобы запятая стояла после первой единицы без учета этой первой единицы и запятой


Немного понимания двоичного представления чисел и связи их с десятичными:

2 = 10000= 1610

2 = 1000= 810

2 = 100= 4

2 = 10= 2

2 = 1= 110

2 -1 = 0.12 =(1/2)10 = 0.510         

2 -2 = 0.012 = (1/4)10 = 0.2510

2 -3 = 0.0012 = (1/8)10 =  0.12510

2 -4 = 0.00012 = (1/16)10 =  0.062510

2 -5 = 0.000012 = (1/32)10 =  0.0312510

2 -6 = 0.0000012 = (1/64)10 = 0.01562510

2 -7 = 0.00000012 = (1/128)10 = 0.007812510

2 -8 = 0.000000012 = (1/256)10 =  0.0039062510

2 -9 = 0.0000000012 = (1/512)10 =  0.00195312510

2 - 10 = 0.00000000012 = (1/1024)10 =  0.000976562510

2 - 11 = 0.000000000012 = (1/2048)10 =  0.0004882812510

2 - 12 = 0.0000000000012 = (1/4096)10 =  0.00024414062510

2 - 13 = 0.00000000000012 = (1/8192)10 =  0.000122070312510

 

Рассмотрим примеры для типа double:

Пример №1

У нас есть десятичное число: 891677.4025191

Данное число можно представить в двоичном виде:

11011001101100011101.011001110000101101111101111000101000001111101110001110
(кто хочет может проверить)))

Выделяем мантиссу данного числа, просто перенеся запятую на 19 разрядов влево(в данном случае), так чтобы она была после первой единицы.

1.1011001101100011101011001110000101101111101111000101000001111101110001110 * 2 19

Но у нас мантисса всего 52 бита. Значит берем первые 52 значащих бита

Мантисса = 1011001101100011101011001110000101101111101111000101

Экспонента = (19+1023)10 = 100000100102 (т.к экспонента является знаковым числом и экспонента может быть отрицательной (например если у нас число 0.0000042132), то необходимо  сложение с 1023 10 (011111111112), 011111111112 – это ноль, все что больше, это положительные, меньше – отрицательные значения. Т.е. чтобы получить обратно значение степени, то из 11 битного значения экспоненты нужно вычесть 1023.

Итого наше число 891677.4025191 будет выглядеть в типе double следующим образом:

0   10000010010  1011001101100011101011001110000101101111101111000101

Но т.к. это двоичное представление, то переведем его точно в десятичное: 

это будет 891677.402519099996425211429595947265625


Пример №2

У нас есть десятичное число:  -0.00000145258556224114

Данное число можно представить в двоичном виде:

-0.000000000000000000011000010111101100111010110111010011010101001111001110

Выделяем мантиссу данного числа, просто перенеся запятую на 20 разрядов вправо, так чтобы она была после первой единицы.

1.1000010111101100111010110111010011010101001111001110 * 2  -20

Мантисса = 1000010111101100111010110111010011010101001111001110

Экспонента = (-20+1023)10 = 011111010112 

знак минус, значит первый бит равен 1.

Итого наше число -0.00000145258556224114 будет выглядеть в типе double следующим образом:

1   01111101011  1000010111101100111010110111010011010101001111001110

переведем его точно в десятичное: 

это будет -0.00000145258556224113991124017968015191826225418481044471263885498046875



В Вашем случае проблема возникает с числом 0.01, т.к. в типе double оно будет представлено в виде:

0  01111111000   0100011110101110000101000111101011100001010001111011

что при переводе в десятичную систему счисления равно  0.0100000000000000002081668171172168513294309377670288085937510

Тогда как с представлением

310 = 1.5*2 = 1.12*2 1

510 = 2.5*2 = 10.12*2 1

610 = 1.5*4 = 1.12*2 2

710 = 3.5*2 = 11.12*2 1

проблем нет.

Почему число double 0.01 реально больше 0.01?

Вот почему:

0 01111111000 0100011110101110000101000111101011100001010001111011  - 0.01000000000000000020816681711721685132943093776702880859375  погрешность =   0.000 000 000 000 000 000 208166817...

0 01111111000 0100011110101110000101000111101011100001010001111010  - 0.0099999999999999984734433411404097569175064563751220703125    погрешность = - 0.000 000 000 000 000 001 52655666...

Для понимания этой химии процесса можете поиграться с этими калькуляторами:
https://babbage.cs.qc.cuny.edu/IEEE-754.old/Decimal.html

https://baseconvert.com/ieee-754-floating-point

 
Vladimir Pastushak:

Весьма занимательная математика 

Результат

2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.06000000   0.01   6.00  Next lot = 0.06999999999999999
2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.06000000   0.01   6.00  Next lot = 0.06999999999999999
2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.06000000   0.01   6.00  Next lot = 0.06999999999999999
2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.06000000   0.01   6.00  Next lot = 0.06999999999999999
2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.06000000   0.01   6.00  Next lot = 0.06999999999999999    Как 0.06000000 + 0.01  становиться 0.06999999999999999 
2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.05000000   0.01   5.00  Next lot = 0.06
2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.04000000   0.01   4.00  Next lot = 0.05
2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.03000000   0.01   3.00  Next lot = 0.04
2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.02000000   0.01   2.00  Next lot = 0.03
2020.01.05 17:09:28.798 Testert EURUSD,H1: 0.01000000   0.01   1.00  Next lot = 0.02


а зачем для дробных чисел (double) использовать функцию MathFloor (Возвращает ближайшее снизу целое числовое значение)?
 
Nikolai Semko:

Постоянно возникает этот вопрос.

круто! на сон грядущий прошелся по инету, а на вопрос "куда пропала последняя итерация" могешь? ;) в этом примере:

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.000000000000000000000000000000000000000000000000000000000000

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

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.299999999999998934185896359849721193313598632812500000000000

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.300000000000011368683772161602973937988281250000000000000000

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

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

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.700000000000017053025658242404460906982421875000000000000000

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

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.000000000000021316282072803005576133728027343750000000000000

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

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

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

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

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

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

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

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

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



на полном серьезе, хочу разобраться и понятное обьяснение, куда делось 20.0 ? 

 
Igor Makanu:

круто! на сон грядущий прошелся по инету, а на вопрос "куда пропала последняя итерация" могешь? ;) в этом примере:

на полном серьезе, хочу разобраться и понятное обьяснение, куда делось 20.0 ? 

Так все просто же:

0.1 в типе double реально 0.1000000000000000055511151231257827021181583404541015625, т.е больше чем 0.1

следовательно? на последней проверке это уже будет больше 20, а точнее 10+100*0.1000000000000000055511151231257827021181583404541015625 ~ 20.000000000000000555111512312578

и цикл заканчивается

а если провести такой эксперимент:

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

то результат последней итерации:

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

Но если поменяем double на float, то результат будет:

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

потому что 0.01 для double больше чем 0.01, а для float меньше

 
Nikolai Semko:

Так все просто же:

0.1 в типе double реально 0.1000000000000000055511151231257827021181583404541015625, т.е больше чем 0.1

следовательно? на последней проверке это уже будет больше 20, а точнее 10+100*0.1000000000000000055511151231257827021181583404541015625 ~ 20.000000000000000555111512312578

и цикл заканчивается

ОК, понял

так и есть, цикл for() итерацию выполнит, и будет сравнивать условие, вопрос решен

можно еще в пример этот код показать:

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.000000000000000000000000000000000000000000000000000000000000

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

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

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

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

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

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

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

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

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

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


тут как и ожидалось, цикл закончился достигнув числа 20

 
Nikolai Semko:

Постоянно возникает этот вопрос.
Постоянно все говорят о стандарте IEEE 754, но часто люди, когда заходят в википедию – то ли по причине сложности, то ли по причине лени уходят, так и не поняв смысл этого стандарта.

Я потрачу немного времени, чтобы попробовать объяснить этот стандарт максимально коротко и простыми словами, чтобы в дальнейшем ссылаться на это сообщение.

Я Вам благодарен, от чистого сердца! Спасибо! 

На это сообщение можно ссылаться не только как на работу чисел double, но и как на пример, грамотного, понятного ответа пользователю, без отправки гуглить.

 
Igor Makanu:

т.е. Вы предлагаете игнорировать сообщения тех кто публикуется в Маркете? ... не уверен, что захочу так делать, был вопрос, было обсуждение, по моему это нормальная ситуация

PS:

в довесок .... попробуйте распринтовать double через printf(), есть у меня подозрение, что будет еще много "о сколько нам открытий чудных готовят просвещенья дух..."

;)

Я ничего не предлагал и никого ни к чему не призывал. Просто считаю, что надо почаще читать на форуме не только то, что сам написал, но и то что пишут другие. Особенно если кто-то из действительно малоопытных задаёт вопросы. Ведь именно в этих вопросах и ответах можно почерпнуть для себя много полезного. Даже можно найти ответ на тот вопрос который самому и не приходил в голову. О таком стандарте IEEE 754 лично я гораздо раньше узнал, именно читая вопросы новичков. Настоящих новичков... Именно такой посыл и был адресован Владимиру в ответе вам.

 
Alexey Viktorov:

Я ничего не предлагал и никого ни к чему не призывал. Просто считаю, что надо почаще читать на форуме не только то, что сам написал, но и то что пишут другие. Особенно если кто-то из действительно малоопытных задаёт вопросы. Ведь именно в этих вопросах и ответах можно почерпнуть для себя много полезного. Даже можно найти ответ на тот вопрос который самому и не приходил в голову. О таком стандарте IEEE 754 лично я гораздо раньше узнал, именно читая вопросы новичков. Настоящих новичков... Именно такой посыл и был адресован Владимиру в ответе вам.

Добавлю свои 5 центов. Все ИМХО. Очень странно заниматься не один год программированием и не изучить базы, а математика чисел с плавающей точкой - это именно база. Так, что только доки и стандарты спасут отцов Русской (и не только) демократии. Курите их вдумчиво.
 
Vladimir Pastushak:

Я Вам благодарен, от чистого сердца! Спасибо! 

На это сообщение можно ссылаться не только как на работу чисел double, но и как на пример, грамотного, понятного ответа пользователю, без отправки гуглить.

Не за что :)

 

Не часто ищу коды стрелок, но в справке их невероятно сложно найти!

Это такая табличка, в которой звёздочки, кружки и т.п.

И поиск что угодно выдаёт, кроме нужного!

Причина обращения: