gpt4 book ai didi

c++ - ceil、floor 和 round 函数会在多大程度上放大精度损失问题,以及如何消除此类影响?

转载 作者:行者123 更新时间:2023-11-30 03:15:08 31 4
gpt4 key购买 nike

我之前发布了一个关于 C++ 函数 ceil()floor()round() 的精度损失问题.问题链接如下。

Will ceil(), floor() and round() meet loss-of-precision problems when converted to integers?

从我收到的两个答案中,我了解到这些函数本身是精确的,但它们会放大现有的精度损失问题。

我想知道这些问题会被放大到什么程度。具体来说,请考虑以下事项。

a = fun(b);

这里,a是一个整型值(intlonglong long等), b是一个float类型的值(float, double等),fun()ceil()floor()round()。请注意,在以下所有讨论中,我假设不存在上溢或下溢问题。

请注意,在这里,我假设 b 是通过其他一些可能导致精度损失的操作获得的。例如,假设我希望 b 等于 1.1 + 3.9 = 5,但是,由于无法表示 1.1 和 3.9,因此 b 不会以 5 结尾。

我想知道这些问题能在多大程度上影响a的值(value)。具体来说,a 的正确值(即,如果 b 没有精度损失)与实际获得的值(即,如果存在潜在的精度损失)有多少差异。假设我们将正确值表示为 a1,将实际值表示为 a2。在我看来,在任何情况下,以下结论都必须成立。

  1. 如果 fun()ceil(),则 a2 等于 a1 或 a1 + 1。
  2. 如果 fun()floor(),则 a2 等于 a1 或 a1 - 1。
  3. 如果fun()round(),那么a2等于a1。

我的问题是,如果我们忽略上溢和下溢

  1. 上述结论是否始终成立?
  2. 如果我无法修复 b 的精度损失,如何修改代码以确保 a2 始终等于 a1?

最佳答案

首先你假设你的错误是b小的。如果错误在b大于 1.0 那么你的结论都不成立。但大概在实践中错误 b很小,这是一个合理的假设。

然而,结论 3 在所有情况下都是错误的。正确的结果是 a2 等于 a1 - 1,或 a1 + 1,或 a1。假设b的正确值为3.49999,实际值为3.50001则round当正确结果为 3 时将给出 4。反之亦然,如果正确值为 3.50001 而实际值为 3.49999,则 round当正确结果为 4 时将给出 3。

至于问题 2,没有简单的答案。而且不可能笼统地回答这个问题,所以需要一些关于你的实际问题的细节。听起来您在需要精确结果时试图使用不精确的算术。也许你需要切换到某种多精度算法,有几个库可以做到这一点,MPIR例如。

关于c++ - ceil、floor 和 round 函数会在多大程度上放大精度损失问题,以及如何消除此类影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57264084/

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