完整正方形的 C++ sqrt 函数精度

标签 c++ floating-point-precision

设,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/

相关文章:

java - 在java中格式化 float 高达3位小数精度

javascript - JS如何只获取长 float 的整数部分?

c++ - 当该参数的类型是模板类型时,如何提供默认参数参数?

c++ - 将 std::endl 传递给 std::operator <<

c++ - 在 C++ 中初始化静态常量数组的特定元素

C++:将 "boost::multiprecision::float128"转换为 "double"

c++ - 为什么我在试图找到 n 个元素的平均值时没有得到正确的值?

c++ - 我怎样才能让 WinProc 访问由它创建的对象?

c++ - cmath 精度误差中的底函数