回答你的问题最好的方法是运行测试(随机分布和基于范围?),看看二进制表示中的结果数字是否有所不同。
请注意,如果您这样做,您将面临一个问题,即由于编码平均值的方式,您的函数将无法处理值
> MAX_INT/2
。
avg = (x1+x2)/2
avg = 0.5*x1 + 0.5*x2
除非您正在编写语言级库,否则这几乎肯定不是问题。如果您的大多数数字很小,那么可能根本没有关系?实际上,这可能不值得考虑,因为方差的值将超过MAX_INT
,因为它是一个平方量; 我想你可能希望使用标准差,但没有人这样做。
在这里,我在Python中进行一些实验(我认为通过委托数学计算给C库,Python支持IEEE什么东西...):
>>> def compare(numer, denom):
... assert ((numer/denom)*2).hex()==((2*numer)/denom).hex()
>>> [compare(a,b) for a,b in product(range(1,100),range(1,100))]
没问题,我认为因为二进制中的2很容易表示成乘法和除法。但是,试试用3进行乘法和除法:
>>> def compare(numer, denom):
... assert ((numer/denom)*3).hex()==((3*numer)/denom).hex(), '...'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
File "<stdin>", line 2, in compare
AssertionError: 0x1.3333333333334p-1!=0x1.3333333333333p-1
这个可能很重要吗?也许如果你正在处理非常小的数字(在这种情况下,您可能希望使用对数算术)。然而,如果您正在处理大量数字(在概率中不常见)并且延迟除法,那么就会像我提到的那样面临溢出的风险,甚至更糟的是,由于难以阅读的代码而导致错误的风险。