gpt4 book ai didi

java - 期望 n 个 float 总和为 1 的合适容差是多少

转载 作者:行者123 更新时间:2023-12-02 01:43:51 25 4
gpt4 key购买 nike

我有 n 个 float ,它们的总和应为 1,每个 float 都可以取 0 到 1 之间的任何值。我想检查它们的总和是否为 1,但考虑到 FP 数字不准确,检查总和 == 1 不会总是工作。

因此我想检查 Math.abs(sum - 1) < epsilon,但我不确定 epsilon 的良好值应该是多少。是否可以确定最大不准确度?

更新:我理解为什么 float 不精确,并且我知道我可以以更精确的方式处理概率。我只是想多了解一点关于 float 的知识。

更新 2:如果我从数学上考虑 float ,它们的总和为 1(例如 0.1 + ... + 0.1)

最佳答案

是的,可以确定使用固定精度 float 进行加法所产生的最大可能“误差”。

但是,此分析的结果对于 epsilon 来说不是有用的值。

考虑以下示例:

float a = 1.0E-37f;
float b = Float.MIN_VALUE;

System.out.println((a+b) == a);
System.out.println(a);
System.out.println(1.0f - a);

打印:

true
1.0E-37
1.0

因此,如果您对 1.0E-37f 执行任意次数的 Float.MIN_VALUE 加法,则总和与 1.0f 的差值code> 仍为 1.0f

这表明,当使用无限精度时,有限精度 float 所引入的最大误差总计为 1.0,实际上是 1.0f - 显然,即作为 epsilon 没有用。仅当已知“足够好”的要求时,才可能确定有用的 epsilon - 这取决于您想要将结果用于什么用途,并且一般无法回答。

<小时/>

当然,上面的示例有点做作,因为它突出显示了在您的情况下可能不可能出现的最坏情况,具体取决于 n 的实际值。

正如 @EricPostpischil 在评论中提到的,

the maximum error of adding any two numbers in [0, 1] is ½ ULP(½), and there are n−1 additions, so the total error is at most (n−1)•½•ULP(½).

正如您从该公式中看到的,需要 n值才能得出 1.0 的误差。 (您可能已经注意到,我在示例中选择了相对较小的值 - 需要很多值才能加起来为 1)。

输入一些数字:

int n = 33554433;
System.out.println((n-1)*0.5*Math.ulp(0.5f));

产量

1.0

如果您的 n 低得多,或者您知道您尚未告诉我们的输入数字的进一步限制,则可能会获得更有用的错误上限.

<小时/>

然而,我的观点仍然成立 - 虽然了解这个上限可能有用,但它不能用作 epsilon 来验证值通常是否“足够好”。

关于java - 期望 n 个 float 总和为 1 的合适容差是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54003108/

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