2015-12-12 3 views
0

В моей программе, у меня есть расчет, какDecimals При вычитании двух чисел

a = a * b * c; 

d = f * b* c; // here f and a are same value 

d = d - a; 

Когда я печатаю значение д, я получил результат ниже:

-1.95399e-14

Таким образом, я установил точность и напечатал переменную, используя фиксированный в cout.

Результат:

-0,00000000000001954

Я хочу, чтобы напечатать значение д и а, перед выражением d = d - a;

Так что я изменил мой код, как,

cout<< d << endl; 

cout<< a << endl; 

Когда я включаю вышеуказанные t горе линии, результат переменной «D» после этого выражения является именно «0»

Если я не напечатаю значение переменной «г» и «а», это дает результат в виде -1.95399e-14;

В обоих случаях я хочу, чтобы результат был равен «0». Как я могу это сделать? Что делает этот cout statment?

+0

Плавающая точка не является точной. Это так просто. http://floating-point-gui.de/ – PaulMcKenzie

+0

Предоставьте код, который вы используете. И как уже было прокомментировано: читайте о плавающих точках, потому что компьютерная арифметика отличается от математической арифметики в отношении некоторых аспектов (особенно точности и арифметики с плавающей запятой). – Elyasin

ответ

1

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

В первом случае компилятор сохраняет результат a и d в регистрах FPU, которые (на x86, в 32-битном коде) имеют более высокую точность, чем двойное. Эти длинные двойные значения затем вычитаются, что дает вам небольшую разницу. Когда вы добавляете в вызов cout, значения a и d записываются в память (оба округляются до одного и того же номера), а затем считывают обратно в регистры FPU для выполнения вычитания, что дает вам нуль.

Смежные вопросы