我正在试验C++。我写了一个简单的函数,它使用非常大的数字来查找三角形的面积。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;
}
我确定答案对某些人来说可能是显而易见的,但是我无法把头绕在它身上。有人可以解释吗?
它的所有关于双精度和表示。当处理非常大的双打时,你可以添加一些不能改变的值,比如在这种情况下添加小号码。当1个外括号中有很长时间没有遇到这种麻烦 – vlad1slav
由于您总是试图获取整数值,因此它不会建议使用double值,因为它会失去精度。你可以这样写:'return static_cast(a) - (b/2)+ 1 + b;' –
Mine