在python程序中查看浮点值的真实值

在python程序中查看浮点值的真实值,python,floating-point,python-2.x,Python,Floating Point,Python 2.x,python cmd行显示浮点值的真实值 >>> 1.5-1.4 0.10000000000000009 从python程序中查看它的明显方式是打印它 >>> print 1.5-1.4 0.1 哪一个似乎会自动包围它?有没有办法从程序中查看浮点值的真实值?在一些Python实现中,可以使用print(“%.9999g”%(1.5-1.4))。这将打印具有9999个有效数字的数字,但尾随的零实际上会抑制该数字的所有有效数字 Python实现可能依赖底层硬件

python cmd行显示浮点值的真实值

>>> 1.5-1.4
0.10000000000000009
从python程序中查看它的明显方式是打印它

>>> print 1.5-1.4
0.1

哪一个似乎会自动包围它?有没有办法从程序中查看浮点值的真实值?

在一些Python实现中,可以使用
print(“%.9999g”%(1.5-1.4))
。这将打印具有9999个有效数字的数字,但尾随的零实际上会抑制该数字的所有有效数字

Python实现可能依赖底层硬件和软件提供浮点服务,可能包括
%.9999g
提供的格式。某些实现可能无法提供查看确切值所需的所有数字。例如,尽管请求了9999,但它们可能会显示四舍五入到大约16位的值

在macOS 10.14.2上的Python 2.7.10中,上面打印的是“0.1000000000000088817841970012523233890533447265625”,这是精确的值


(相比之下,
print(“%.9999g”%.1)
打印“0.1000000000000005555115123125782702118158340451015625”。

考虑到IEEE 754双精度可能需要多达767个有效位才能打印基数10中的真值(不考虑前导零),但只有53位,基数10中的真值可能不是您想要的

repr
已经足够好了:它是最短的10进制数,四舍五入到相同的浮点。
因此,每两个不同的浮点都有一个不同的
repr
,它将唯一地标识您的浮点

如果是为了更好地查看内部表示,您可以使用
十六进制
以16为基数打印,您将得到一个前导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))
第二种形式的773个字符(767个有效位数字+1个字符表示点+5个字符表示指数)很难破译

NOTA:在python 2.7中,使用此行设置y

y=float(2/decimal.Decimal(f)-1/decimal.Decimal(u))

0.100000000000009
也不是真实值-它也是四舍五入的。如果您想查看真实值,请使用。此外,如果可以,请迁移到Python 3。Python2离生命结束还有不到一年的时间,“True”值在这里很复杂。由
repr
生成的字符串(例如,在这里的Python REPL中)与由
str
生成的字符串(由
print
使用)的舍入方式不同。但两者都不比另一个更正确:如果您将这两个字符串解析回
float
对象,您将看到它们都表示相同的值(这不是精确的0.1,而是最接近0.1的可表示值。@DanielPryden的可能重复:它实际上不是最接近0.1的可表示值。它比最接近的可表示值高出6步。此外,我在Squeak Smalltalk中进行了所有计算,其中只有严格的IEEE 754双精度,没有其他可能的易变的浮点表示法,并且由于无限大的整数和分数,所有的二进制/十进制转换都可以不费吹灰之力地执行…我很有信心我会犯错误,这就是为什么我更喜欢使用健壮的工具和双重检查…0x1.fffffffffffffp-1022不是可表示的吗?您计算了多少个有效位r它的精确基数是10?
y=float(2/decimal.Decimal(f)-1/decimal.Decimal(u))