Python 为什么这个浮子会溢出

Python 为什么这个浮子会溢出,python,floating-point,python-3.5,Python,Floating Point,Python 3.5,我知道浮点数的精度有限。但我不明白为什么64位浮点(我假设是)会溢出这些值: ipdb> (-1e+10 - 0.01) -10000000000.01 # 0.01 still visible ipdb> (-1e+20 - 0.01) -1e+20 # 0.01 is gone, I assume because of floating point precision 这可能与: ipdb> sys.float_info sys.float_info(max=1.7

我知道浮点数的精度有限。但我不明白为什么64位浮点(我假设是)会溢出这些值:

ipdb> (-1e+10 - 0.01)
-10000000000.01  # 0.01 still visible
ipdb> (-1e+20 - 0.01)
-1e+20  # 0.01 is gone, I assume because of floating point precision 
这可能与:

ipdb> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

请注意,我想要解决的实际问题是将这些值规格化为介于0和1之间的
[-1.322999632394e+3215000.0,-11.432000160217285,-11.321000099182129]

通常不需要这种精度,但有一些软件包可以为您这样做

将输出:

True
False
缩放也有效

从bigfloat导入精度,bigfloat

listy = [-1.3229999632394e+32, 15000.0, -11.432000160217285, -11.321000099182129]
m = min(listy) #do this before import, as BigFloat
M = max(listy)

with precision(128):
    scale = lambda x : (x-BigFloat(m)) / (BigFloat(M)-BigFloat(m))
    print [ scale(BigFloat(i)) for i in listy ]

我没有看到任何溢出。你能澄清一下吗?你看到了什么,你希望看到什么(为什么)?你说的是什么溢出?这不是溢出,这是你说你理解的浮点数的有限精度。你可以使用提供高精度二进制浮点的软件包(比如gmpy2)。但根据我的经验,这很少需要——更常见的是,你实际上需要做的是重新制定你的方法,不需要超过16位的精度。
listy = [-1.3229999632394e+32, 15000.0, -11.432000160217285, -11.321000099182129]
m = min(listy) #do this before import, as BigFloat
M = max(listy)

with precision(128):
    scale = lambda x : (x-BigFloat(m)) / (BigFloat(M)-BigFloat(m))
    print [ scale(BigFloat(i)) for i in listy ]