我正在試驗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