Правда ли, что последняя ненулевая цифра справа от десятичной точки в нецелом числе с плавающей запятой всегда равна 5? Может ли кто-то доказать [ред] это официально? Кроме того, сколько нулей подряд справа от запятой необходимо, чтобы сделать вывод, что дальше справа больше нет ненулевых цифр — я видел числа, такие как 1,23450678500000 (пример, вероятно, не настоящий). float), так что я знаю, что это как минимум два.
Доказательство того, что последняя ненулевая цифра справа от десятичной точки в нецелом числе с плавающей запятой всегда равна 5?
Ответы (2)
Правда ли, что последняя ненулевая цифра справа от десятичной точки в нецелом числе с плавающей запятой всегда равна 5?
В двоичном формате с плавающей запятой, если число не является целым числом, последняя ненулевая цифра его десятичного числа равна 5.
Generally, a floating-point format represents numbers as some integer M multiplied by power e of a fixed-base b: M•be, with various limits on M and e. Если b равно двум, мы называем это двоичным форматом. В настоящее время наиболее распространены двоичные форматы с плавающей запятой. Некоторые платформы поддерживают десятичные форматы, где b равно 10. Другие основания математически возможны, но используются редко, хотя в прошлом иногда использовалось 16.
To see the last digit is 5, consider the form M•be. Единственный способ, которым это может быть нецелым числом, это чтобы e было отрицательным. If M is even, we can reduce the form to (M/2)•be−1, и, если M/2 также четно, мы можем сокращать дальше и продолжать сокращать, пока не получим нечетное целое число, умноженное на отрицательную степень 2. Это эквивалентно делению на положительную степень 2 Затем мы видим, что последняя цифра 5:
.- Если мы делим на 21, получается число 0,5, 1,5, 2,5, 3,5 и т. д.
- Если мы делим на 22, число составляет половину от одного из них, то есть 0,25, 0,75, 1,25, 1,75 и т. д.
- Если мы делим на любую большую степень 2, мы всегда делим некоторое число, оканчивающееся на 5, на 2, а это означает, что мы переносим ½ дроби с позиции, где находится 5, на следующую позицию, производя половину 10 там, а половина 10 это 5.
С другой стороны, мы можем видеть, что умножение числительного на 2, даже многократное, никогда не может сделать позицию цифры 0, если это не 0 или 5. Умножение 1, 2, 3, 4, 6, 7, 8 или 9, даст 2, 4, 6, 8, 2, 4, 6 и 8 соответственно, а умножение их на 2 дает цифру из того же набора. Таким образом, если нецелое число, умноженное на степень 2, дает целое число, его последняя ненулевая цифра должна быть 5.
Кроме того, сколько нулей в строке справа от запятой необходимо, чтобы сделать вывод, что дальше справа больше нет ненулевых цифр…
Это зависит от конкретного формата с плавающей запятой. Высокоточный формат может представлять числа, очень близкие к некоторому числу .xxxx500, но не равные ему. Для любого заданного формата с плавающей запятой должен быть некоторый предел количества нулей, которые могут быть перед ненулевой цифрой, но для его определения может потребоваться некоторая работа. Если вы беспокоитесь о том, чтобы найти количество цифр, необходимое для точного представления числа с плавающей запятой, есть другие способы приблизиться к этому.
Относительно 2-го вопроса (рассказал): >>> в 1.5000005 # ОК
>>> print("%f") % (v)
1.500001
**# Maybe not...**
>>> print("%.15f") % (v)
1.500000500000000
**# Ends in 5, so OK now, right? No! It should've rounded to even. Huh?**
>>> print("%.16f") % (v)
1.5000005000000001
**# "16 decimal digits is accuracy", I learned in school**
>>> print("%.31f") % (v)
1.5000005000000000698889834893635
**#NOT SO FAST; but now I found the real value since it ends in 5--see, "I'm smart, and I want respect" (Fraedo)**
>>> print("%.2000f") % (v)
1.50000050000000006988898348936345428228378295898437500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
**# I should have listened to mom, and been a Mail Man! (are there yet more lurking non-zero digits???)**
Значение x
, представленное в формате IEEE 754 binary64 и удовлетворяющее 2**(e-1) <= x < 2**e
, требует не более max(53 - e, 0)
цифр после точки для точного представления в десятичном виде. Так, например, для x
в [0.5, 1.0)
вам нужно не более 53 цифр после точки; для x
в [0.25, 0.5)
не более 54 цифр; для x
в [1.0, 2.0)
не более 52 цифр и так далее. Вам также может быть интересно узнать, что для формата IEEE 754 binary64 максимальное количество последовательных нулей (заключенных в скобки ненулевыми цифрами с обоих концов) в любом десятичном представлении равно 20. См. coderhelper.com/q/20273877/270986.
regarding the second Q: v1=0.0625000000000000277555756156289135105907917022705078125, v2=0.06250000000000001387778780781445675529539585113525390625, both are exact (maybe this second question should be an independent Q~how can a mere mortal conclude from inspection (vs actual conversion) that a non whole number float is displayed exactly? )