提问人:Falk 提问时间:2/3/2022 最后编辑:petezurichFalk 更新时间:2/3/2022 访问量:105
使用 numpy.float128 对大于 epsilon 的数字进行添加的错误结果
wrong result on adition of numbers larger than epsilon using numpy.float128
问:
考虑到 epsilon 是您可以加到 1 的最小数字。
当我执行加法并打印结果时,我得到的是 1 而不是 1+epsilon。
我已经实现了一个函数。我添加了一个用于调试的语句。getEpsilon
print
该函数的实现方式如下:
def getEpsilon():
a = np.float128(1)
b = np.float128(1)
c = np.float128(2)
while a + b != a:
b = b / c
d = a+b
print (F"b={b:3.50f}, d={d:3.50f}")
return b * c
在对 while 循环进行多次迭代后,其值仅为 1,但仍计算为 True。d
a + b != a
这是输出:
b=0.5000000000000000000000000, d=1.5000000000000000000000000
b=0.2500000000000000000000000, d=1.2500000000000000000000000
...
b=0.0000000000000004440892099, d=1.0000000000000004440892099
b=0.0000000000000002220446049, d=1.0000000000000002220446049
b=0.0000000000000001110223025, d=1.0000000000000000000000000
b=0.0000000000000000555111512, d=1.0000000000000000000000000
...
b=0.0000000000000000001084202, d=1.0000000000000000000000000
b=0.0000000000000000000542101, d=1.0000000000000000000000000
为什么有与不同的行为a + b != a
d = a+b
看起来有些操作是用 64 位完成的。
如果我用等效的类型重复它,结果是(最后 2 行):float64
b=0.0000000000000002220446049, d=1.0000000000000002220446049
b=0.0000000000000001110223025, d=1.0000000000000000000000000
答: 暂无答案
评论
d={d!r}
np.float128 provide only as much precision as np.longdouble, that is, 80 bits on most x86 machines and 64 bits in standard Windows builds
print (F"b={b:3.50f}, d={d:3.50f}")
float64
float128
float128
d
float64
d
!r
float128.__format__
long double
double
float
float32
float