видя истинное значение с плавающей точкой в ​​программе Python - PullRequest
0 голосов
/ 06 февраля 2019

Строка Python cmd показывает истинное значение с плавающей точкой легко

>>> 1.5-1.4
0.10000000000000009

Очевидный способ увидеть его из программы Python - это напечатать его

>>> print 1.5-1.4
0.1

, что выглядитавтоматически его округлить?Есть ли способ увидеть истинное значение с плавающей точкой из программы?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Учитывая, что для двойной точности IEEE 754 может потребоваться до 767 знаков и цифр, чтобы вывести истинное значение в базе 10 (без учета начальных нулей), но только 53 бита, возможно, истинное значение в базе 10 не то, что вам нужно.

repr достаточно хорош: это самое короткое число из 10 оснований, округленное до одного и того же числа с плавающей точкой.
Таким образом, каждые два различных числа с плавающей точкой имеют разные значения repr, и оно однозначно идентифицирует ваше число с плавающей точкой.

Если вы хорошо видите внутреннее представление, вы можете напечатать в базе 16 с помощью hex, вы получите первые 1 (или 0 для субнормалей) и 13 шестнадцатеричных «цифр», кодирующих 4 бита каждая, плюс основание 2экспонента (записана в базе 10).

Вот пример:

import decimal
f=1<<1022
u=1<<(1022+53-1)
y=2/f-1/u
print(repr(y))
print(decimal.Decimal(y))
print(len(str(decimal.Decimal(y))))
print(float.hex(y))

Выходные данные

4.4501477170144023e-308                                                                                                 
4.4501477170144022721148195934182639518696390927032912960468522194496444440421538910330590478162701758282983178260792422
137401728773891892910553144148156412434867599762821265346585071045737627442980259622449029037796981144446145705102663115
100318287949527959668236039986479250965780342141637013812613333119898765515451440315261253813266652951306000184917766328
660755595837392240989947807556594098101021612198814605258742579179000071675999344145086087205681577915435923018910334964
869420614052182892431445797605163650903606514140377217442262561590244668525767372446430075513332450079650686719491377688
478005309963967709758965844137894433796621993967316936280457084866613206797017728916080020698679408551343728867675409720
757232455434770912461317493580281734466552734375E-308                                                                   
773                                                                                                                     
0x1.fffffffffffffp-1022

Вы вряд ли сможете расшифровать вторую форму с ее 773 символами(767 знаков и цифр + 1 символ для точки + 5 символов для показателя степени).

ПРИМЕЧАНИЕ: в Python 2.7, установите y с этой строкой

y=float(2/decimal.Decimal(f)-1/decimal.Decimal(u))
0 голосов
/ 06 февраля 2019

В некоторых реализациях Python вы можете использовать print("%.9999g" % (1.5-1.4)).Это должно вывести число с 9999 значащими цифрами, но с подавленными конечными нулями - фактически все значащие цифры числа.

Реализации Python могут полагаться на базовое аппаратное и программное обеспечение для служб с плавающей запятой, возможно, включая форматированиепредоставлено %.9999g.Некоторые реализации могут не предоставлять все цифры, необходимые для просмотра точного значенияОни могут показывать значение, округленное до 16 цифр, например, несмотря на то, что было запрошено 9999.

В Python 2.7.10 на macOS 10.14.2 вышеприведенный вывод «0.100000000000000088817841970012523233890533447265625», то естьточное значение.

(для сравнения print("%.9999g" % .1) печатает «0.1000000000000000055511151231257827021181583404541015625».)

...