C++ 精度使用 long long 和 double

标签 c++ precision

我正在试验 C++。我编写了一个简单的函数,它使用非常大的数字来计算三角形的面积。

我将两个大数字传递给函数,然后从一个单独的函数 getValue() 返回一个不同方程式的单独值。我很好奇为什么当我将 1 放在括号外的线上时,就像这样:

return (long long)(a - b / 2.0) + b + 1;

我得到值 9007200509008001

当我将 1 放在括号内时,如下所示:

return (long long)(a - b / 2.0 + 1) + b;

我得到 9007200509008000

第二个值比第一个小一个,即使计算结果应该相同。

#include <iostream>

double triangleArea(int b, int h)
{
    long long bh = (long long)b * h;
    return 0.5 * bh;
}

long long getValue()
{
    int deltaY = 18014400;
    int deltaX = 1000000000;

    long b = deltaY + deltaX + 1600;
    double a = triangleArea(deltaX, deltaY);
    return (long long)(a - b / 2.0) + b + 1;
}

int main(int argc, char **argv) 
{
    std::cout << getValue() << std::endl;
}

我确信答案对某些人来说可能是显而易见的,但我无法理解。谁能解释一下?

最佳答案

当您除以 2.0 时,您可以隐式转换为 double。 double 限制为大约 15 位十进制数字。所以第 16th 位会发生什么是完美定义的,但可能不是您所期望的。

如果您需要准确性,请尝试使用long longunsigned long long 并仔细控制您没有溢出。如果还不够,您将不得不使用多精度算术(例如 GMP )。因为一旦您使用双 float ,您的精度就会被限制为 53 位二进制数字,或大约 15-16 位十进制数字。

关于C++ 精度使用 long long 和 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35742140/

相关文章:

java - 在Java中使用C++模板框架

c++ - std::unique 与谓词比较 std::string 不删除重复项

floating-point - 如何在没有下溢的情况下计算对数空间中的总和?

python - 返回 inf : how can I solve this? 的 pandas DataFrame 列的 mean()

java - 为什么 HBase 中的 Bytes.toBytes() 无法返回我在我的情况下搜索的最后一行?

c++ - 我应该通过引用传递 shared_ptr 吗?

c++ - 追加二进制文件

c++ - 最大化精度的操作顺序

c++ - 保持 shared_ptr use_count() 为 1

floating-point - 为什么 float 不正确?