gpt4 book ai didi

c++ - 舍入误差检测

转载 作者:太空狗 更新时间:2023-10-29 19:51:16 24 4
gpt4 key购买 nike

我有两个整数 n 和 d。这些可以用双 dn(n) 和双 dd(d) 精确表示。 C++ 中是否有可靠的方法来检查

double result = dn/dd

包含舍入错误?如果它只是一个整数除法检查 (n/d) * d==n 是否可行,但使用 double 算法执行此操作可能会隐藏舍入错误。

编辑:发布这篇文章后不久,我突然想到将舍入模式更改为 round_down 会使 (n/d)*d==n 测试适用于 double。但如果有更简单的解决方案,我还是想听听。

最佳答案

如果硬件 FMA 可用,那么在大多数情况下(n 预计不小的情况,如下所示),最快的测试可能是:

#include <cmath>

double q = dn/dd;
if (std::fma(-q, dd, dn))
std::cout << "Quotient was not exact.\n";

如果 ndqdd 太小以至于四舍五入为零,这可能会失败,这发生在最近舍入中-ties-to-even 模式,如果它的幅度小于最小可表示正值的一半(通常为 2−1074)。这只有在 dn 本身很小的情况下才会发生。如果需要的话,我希望我可以计算 dn 的一些界限,并且鉴于 dn = nn 是一个整数,不应出现。

忽略指数界限,一种测试可整除有效数字的方法是:

#include <cfloat>
#include <cmath>

int sink; // Needed for frexp argument but will be ignored.
double fn = std::ldexp(std::frexp(n, &sink), DBL_MANT_DIG);
double fd = std::frexp(d, &sink);
if (std::fmod(fn, fd))
std::cout << "Quotient will not be exact.\n";

鉴于 nd 是在浮点类型中可以精确表示的整数,我认为我们可以证明它们的指数不能满足上述测试失败。在某些情况下,n 是一个小整数而 d 是一个大整数(从 21023 到 21024 的值) −2972,包括)我需要考虑。

关于c++ - 舍入误差检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50228310/

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