[英]Why does this float overflow
我知道浮點數的精度有限。 但是我不明白為什么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.3229999632394e+32, 15000.0, -11.432000160217285, -11.321000099182129]
通常不需要這種精度,但是有些軟件包可以為您做到這一點,例如Bigfloat
from bigfloat import *
print (-1e+20 - 0.01) == -1e20
with precision(64*2):
a = BigFloat.exact(-1e+20)
b = BigFloat.exact(0.01)
print a == b
將輸出:
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 ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.