设,x
是一个整数并且y = x * x
。
那么是否保证sqrt(y) == x
?
例如,我能否确定 sqrt(25)
或 sqrt(25.0)
将返回 5.0
,而不是 5.0000000003
还是 4.999999998
?
最佳答案
符合 IEEE-754 标准的基本操作允许错误的实现(其中 sqrt
是一个示例)要求正确舍入值。
这意味着误差将小于 1/2 ULP(最后一位的单位)或基本上尽可能接近实际答案。
要回答您的问题,如果实际答案完全可以用 double
表示,那么您将得到准确的答案。
注意:这不是由 C++ 标准保证的,而是 IEEE-754 标准保证的,这对大多数人来说可能不是问题。
最终,一个简单的测试应该足以满足您的目的:
for(int i = 0; i < (int)std::sqrt(std::numeric_limits<int>::max()); i++)
{
assert((int)(double)i == i);//Ensure exactly representable, because why not
assert(std::sqrt((double)i*i) == i);
}
如果一切顺利,我认为没有任何理由担心。
关于完整正方形的 C++ sqrt 函数精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20137105/