Доказательство того, что последняя ненулевая цифра справа от десятичной точки в нецелом числе с плавающей запятой всегда равна 5?

avatar
Andrew
8 августа 2021 в 18:56
68
2
0

Правда ли, что последняя ненулевая цифра справа от десятичной точки в нецелом числе с плавающей запятой всегда равна 5? Может ли кто-то доказать [ред] это официально? Кроме того, сколько нулей подряд справа от запятой необходимо, чтобы сделать вывод, что дальше справа больше нет ненулевых цифр — я видел числа, такие как 1,23450678500000 (пример, вероятно, не настоящий). float), так что я знаю, что это как минимум два.

Источник

Ответы (2)

avatar
Eric Postpischil
8 августа 2021 в 21:07
2

Правда ли, что последняя ненулевая цифра справа от десятичной точки в нецелом числе с плавающей запятой всегда равна 5?

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

Generally, a floating-point format represents numbers as some integer M multiplied by power e of a fixed-base b: Mbe, with various limits on M and e. Если b равно двум, мы называем это двоичным форматом. В настоящее время наиболее распространены двоичные форматы с плавающей запятой. Некоторые платформы поддерживают десятичные форматы, где b равно 10. Другие основания математически возможны, но используются редко, хотя в прошлом иногда использовалось 16.

To see the last digit is 5, consider the form Mbe. Единственный способ, которым это может быть нецелым числом, это чтобы 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, но не равные ему. Для любого заданного формата с плавающей запятой должен быть некоторый предел количества нулей, которые могут быть перед ненулевой цифрой, но для его определения может потребоваться некоторая работа. Если вы беспокоитесь о том, чтобы найти количество цифр, необходимое для точного представления числа с плавающей запятой, есть другие способы приблизиться к этому.

Andrew
9 августа 2021 в 08:30
0

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? )

avatar
Andrew
9 августа 2021 в 15:02
0

Относительно 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???)**
Mark Dickinson
9 августа 2021 в 18:31
0

Значение 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.