当前位置:  开发笔记 > 编程语言 > 正文

如何将double/float舍入到BINARY精度?

如何解决《如何将double/float舍入到BINARY精度?》经验,为你挑选了1个好方法。

我正在为执行浮点数计算的代码编写测试.很可能,结果很少是准确的,我想在计算结果和预期结果之间设置一个容差.我已经验证了在实践中,使用双精度,在舍入最后两位有效小数后,结果总是正确的,但通常在舍入最后一个小数之后.我知道存储doubles和floats 的格式,以及舍入的两种主要方法(精确通过BigDecimal和通过乘法math.round和除法更快).由于尾数以二进制形式存储,是否有办法使用基数2而不是10来执行舍入?

只是清除最后3位几乎总能产生相同的结果,但是如果我可以推动它而是在尾数"加2",如果它的第二个最小有效位被设置,我可能达到精度极限.这很容易,我希望我不知道如何处理溢出(当所有位52-1都置位时).

Java解决方案将是首选,但如果我理解的话,我可能会将其中一个用于另一种语言.

编辑:作为问题的一部分,我的代码在算术方面是通用的(依赖于scala.Numeric类型类),我所做的是将答案中建议的舍入结合到一个新的数字类型中,该数字类型带有计算的数字(浮点数)在这种情况下)和舍入误差,基本上代表一个范围而不是一个点.然后我重写等于如果它们的误差范围重叠两个数字是相等的(并且它们共享算术,即数字类型).



1> Pascal Cuoq..:

是的,四舍五入的二进制数字比通过更有意义BigDecimal,如果你不担心在一个小的因素范围内,可以非常有效地实现Double.MAX_VALUE.

您可以使用Java中的以下序列舍入浮点doublex(未经测试):

double t = 9 * x; // beware: this overflows if x is too close to Double.MAX_VALUE
double y = x - t + t;

在此序列之后,y应包含舍入值.调整常量9中两个设置位之间的距离,以调整四舍五入的位数.该值3四舍五入.该值5四舍五入.该值17四舍五入,依此类推.

该指令序列归属于Veltkamp,通常用于"Dekker乘法".这个页面有一些参考.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有