如何在不使用小数、分数或任何其他外部库的情况下修复浮点数中的Python舍入错误



我有一个类模拟器:

class Simulator: # we use a class just to hold variables between calls
def __init__(self):
# initialise accumulators
self.a_sum = 0
self.b_sum = 0

def update(self, a, b):
# increment
self.a_sum += a
self.b_sum += b

def results(self):
# return a  pair of results
return self.a_sum, self.a_sum - self.b_sum

如果我打印结果

a_error, d_error = simulate(Simulator())
print(f"Error in a_sum is {a_error} and {d_error} in d_sum")

我得到了Error in a_sum is 13.7734375 and 4.101232676410264e-08 in d_sum,它是由使用浮点数引起的。我知道计算是如何进行的,但我想知道是否有可能在不转换为十进制的情况下纠正错误?我试过四舍五入:

def update(self, a, b):
# increment
self.a_sum += round(a, 3)
self.b_sum += round(b, 3)

这使得错误的数字略低:Error in a_sum is 5.375 and 4.101232676410264e-08 in d_sum,但在那之后我再也无法得到更低的数字。

有什么想法吗?

如何在不使用小数、分数或任何其他外部库的情况下修复浮点数中的Python舍入错误

浮点算法:问题和限制

(…)有许多不同的十进制数字共享相同的数字最近的近似二进制分数。例如,数字0.10.100000000000000010.1000000000000000055511151231257827021181583404541015625全部近似为CCD_ 6。因为所有这些十进制值具有相同的近似值,其中任何一个都可以在保持不变的CCD_ 7的同时显示。(…)这正是二进制浮点的本质:这是不是Python中的错误,也不是代码中的错误。你会在所有支持您硬件的浮点运算(尽管有些语言可能没有默认情况下或在所有输出模式下显示差异)。

emphasis是我添加的,所以我认为在这种情况下修复float的唯一方法是根本不使用float。如果没有十进制、分数或任何其他外部库,这通常是不可行的。

相关内容