gpt4 book ai didi

c++ - 在此示例中在 FP 上使用 == 是否安全

转载 作者:可可西里 更新时间:2023-11-01 17:38:06 26 4
gpt4 key购买 nike

我无意中发现了这段代码 here .

Generators doubleSquares(int value)
{
Generators result;
for (int i = 0; i <= std::sqrt(value / 2); i++) // 1
{
double j = std::sqrt(value - std::pow(i, 2)); // 2
if (std::floor(j) == j) // 3
result.push_back( { i, static_cast<int>(j) } ); // 4
}
return result;
}

我是否认为//3 是危险的?

最佳答案

C++ 标准不保证此代码按预期工作。

一些低质量的数学库不会为 pow 返回正确舍入的值,即使输入具有整数值并且可以精确表示数学结果也是如此。 sqrt 也可能会返回不准确的值,尽管此函数更容易实现,因此很少出现缺陷。

因此,不能保证 j 是您预期的整数。

在高质量的数学库中,powsqrt 在数学结果可以精确表示时将始终返回正确的结果(零错误)。如果您有高质量的 C++ 实现,此代码应该可以按预期工作,直至达到所用整数和浮点类型的限制。


改进代码

这段代码没有理由使用powstd::pow(i, 2) 应该是 i*i。这导致精确的算术运算(直到整数溢出点)并完全避免了 pow 是否正确的问题。

消除 pow 只留下 sqrt。如果我们知道实现返回正确的值,我们可以接受使用 sqrt。如果没有,我们可以改用它:

for (int i = 0; i*i <= value/2; ++i)
{
int j = std::round(std::sqrt(value - i*i));
if (j*j + i*i == value)
result.push_back( { i, j } );
}

此代码仅依赖于 sqrt 返回精度在 .5 以内的结果,即使是低质量的 sqrt 实现也应该提供合理的输入值。

关于c++ - 在此示例中在 FP 上使用 == 是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21247699/

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