У меня есть следующий фрагмент кода
#include <iostream>
#include <iomanip>
int main()
{
double x = 7033753.49999141693115234375;
double y = 7033753.499991415999829769134521484375;
double z = (x+ y)/2.0;
std::cout << "y is " << std::setprecision(40) << y << "\n";
std::cout << "x is " << std::setprecision(40) << x << "\n";
std::cout << "z is " << std::setprecision(40) << z << "\n";
return 0;
}
Когда запускается приведенный выше код, я получаю,
y is 7033753.499991415999829769134521484375
x is 7033753.49999141693115234375
z is 7033753.49999141693115234375
Когда я делаю то же самое в Wolfram Alpha, значение z равносовершенно другой
z = 7033753.4999914164654910564422607421875 #Wolfram answer
Я знаком с точностью с плавающей запятой и то, что большие числа вдали от нуля не могут быть точно представлены. Это то, что здесь происходит? В любом случае, в c ++ я могу получить тот же ответ, что и Вольфрам, без потери производительности?