gpt4 book ai didi

java - 如何将 double / float 舍入为二进制精度?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:22:13 25 4
gpt4 key购买 nike

我正在为对 float 执行计算的代码编写测试。不出所料,结果很少是准确的,我想在计算结果和预期结果之间设置一个公差。我已经验证,在实践中, double 结果在最后两位有效小数四舍五入后总是正确的,但通常在最后一位小数四舍五入后。我知道 doublefloat 的存储格式,以及舍入的两种主要方法(通过 BigDecimal 精确)通过乘法、math.round 和除法更快)。然而,由于尾数是以二进制形式存储的,有没有一种方法可以使用基数 2 而不是基数 10 来执行舍入?

只需清除最后 3 位几乎总是会产生相同的结果,但如果我可以推送它,而不是在设置了第二个最低有效位的情况下向尾数“加 2”,我可能会达到准确度的极限。这很容易,但我不知道如何处理溢出(当所有位 52-1 都已设置时)。

首选 Java 解决方案,但如果我理解它,我可能可以将它移植到另一种语言。

编辑:作为问题的一部分,我的代码在算术方面是通用的(依赖于 scala.Numeric 类型类),我所做的是将答案中建议的舍入合并到一个新的数字类型中,它带有计算出的数字(在本例中为 float )和舍入误差,本质上代表一个范围而不是一个点。然后我覆盖等于,以便如果两个数字的误差范围重叠(并且它们共享算术,即数字类型),则两个数字相等。

最佳答案

是的,四舍五入二进制数字比通过 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 乘法”。 This page有一些引用。

关于java - 如何将 double / float 舍入为二进制精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41583249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com