Почему умножение двух больших двойных чисел дает неверный результат?

Результат для этого двойного умножения (double)1000000007 * (double)11111111 должен заканчиваться на 7 (или быть точным, равным 11111111077777777). Но этот фрагмент кода, который я написал, выводит результат, оканчивающийся на 6 (или, если быть точным, равным 11111111077777776). Я не могу понять, что я могу делать неправильно. Любая помощь будет здорово.

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    cout << setprecision(40) << (double)1000000007 * (double)11111111;
}

person f1zz0_13    schedule 10.01.2013    source источник


Ответы (3)


Когда вы выполняете умножение со значениями double, результаты не точны. Существует неотъемлемая точность, доступная для double, которая, хотя и достаточно точна, недостаточно точна, чтобы точно представлять ваше значение.

Я рекомендую прочитать Что каждый программист должен знать об арифметике с плавающей запятой.

person Reed Copsey    schedule 10.01.2013
comment
Чтобы быть точным, умножение двух double абсолютно точно, но не точно. (Вы всегда будете получать один и тот же ответ, и его можно определить заранее, но он не будет правильным, если ваша ментальная модель double является реальным числом) - person Yakk - Adam Nevraumont; 11.01.2013

Математика с плавающей запятой не точна, она просто очень точна. Я рекомендую вам прочитать об этом здесь: http://en.wikipedia.org/wiki/Floating_point

По сути, битов недостаточно для точного представления этого числа, поэтому вы получаете ошибки точности.

person hexist    schedule 10.01.2013

Вы не делаете ничего плохого. Это связано с реализацией двойников. Если вам нужна точность, превышающая ту, которую обеспечивает реализация двойников, наверняка есть библиотеки, доступные для операций с "большими числами".

person PinkElephantsOnParade    schedule 10.01.2013