Я экспериментирую с 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