可以看到,在使用了Kahan求和公式之后,虽然还是使用的float32单精度浮点数,但其实结果精度已经比普通的单精度计算高了两个量级。另外再测试一下大数加小数的问题,这里我们也使用累加的形式测试,结果展示会更加明显一些: import numpy as np np.random.seed(1) sum_1 = np.array([1000000.], np.float64) sum_...
* @param scale * 精度位数(保留的小数位数). * @param roundingMode * 精度取值方式. * @return 精度计算后的数据. */ public static double round(double value, int scale, int roundingMode) { BigDecimal bd = new BigDecimal(value); bd = bd.setScale(scale, roundingMode); double d = bd.doubleV...
最简单的来说,要解决这个问题,只要把计算精度改用双精度浮点数就可以了。但是使用双精度浮点数就意味着内存占用的翻倍,计算也会更加的耗时,而且有一些硬件可能根本就不支持使用双精度浮点数。这里还有一个方法,那就是Kahan求和公式。简单来说就是,每一步计算的误差可以归结为:(a+b)-a-b,那么就保存这个误差的计...