2016-11-11 8 views
2

Может кто-то объяснить, почему в Lua бега:Lua десятичная точность потери

return 256.65 * 1000000 + .000000005 - 256 * 1000000 gives 649999.99999997 

тогда

return 255.65 * 1000000 + .000000005 - 255 * 1000000 and 
return 268.65 * 1000000 + .000000005 - 268 * 1000000 give 650000.0 ? 

Из того, что я могу видеть это, как представляется, является проблемой исключительно для десятичного 65 (и, кажется, также 15) и для целых чисел в диапазоне 256 - 267. Я знаю, что это связано с выполнением этих расчетов с плавающими точками, но мне все же интересно узнать, что особенно важно в этих значениях, в частности

+2

При печати номер 'x' путем выдачи команды' печати (х) ', Lua показывает' string.Format ("%. 14g", х) 'вместо всех доступных цифр числа' x' (см. [Источник Lua] (https://www.lua.org/source/5.3/luaconf.h.html#LUA_NUMBER_FMT)). Вы можете попробовать 'print (string.format («%. 17g », x))', чтобы просмотреть больше цифр. –

+1

Ваш второй фрагмент кода недействителен. – warspyking

+0

Что значит недействительный? Чтобы быть ясным, я имел в виду их как два отдельных фрагмента кода, а не два оператора возврата и ed вместе. Приносим извинения, если это было неясно – David

ответ

2

Что такое особенность этих значений заключается в том, что 0,65 не является двоичной дробью (даже если она является десятичной дробью) и поэтому не может быть точно представлена ​​в плавающей точке.

Для справки это не относится к Lua. То же самое произойдет и в C.

+1

Правильно, но ни один из них .64, и это не имеет этой проблемы. Кроме того, это не объясняет, почему это не происходит с 252.65, например – David

1

По той же причине, что 10/3 является повторяющейся фракцией в основании 10. В основании 3 разделение на 3 приведет к целым числам. В базе 2 - которая используется для представления чисел в компьютере - числа, которые вы производите, аналогично приводят к фракциям, которые могут быть точно представлены.

Further reading.

+1

Да, я все это понимаю. Я до сих пор не понимаю, что такое магия в диапазоне от 255 до 268. Если вы говорите, что это потому, что .65 невозможно точно представить, почему этого не происходит для 259.65. Также почему это не происходит для .64 или любого другого десятичного знака, который не может быть представлен точно в двоичном – David

Смежные вопросы