Учитывая, что для двойной точности 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))