Проблема с числами в С.

dhifu9

Возникла проблема,может ломовская,но если кто-то уже сталкивался ,сэкономьте время плз.
Написал следующий код в MS Visual Studio 6.

#include <iostream.h>

int main
{
cout<<(0.4*3)+(-0.6*2)<<endl;
return 0;
}

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

Ober

Выводит не ноль
Вполне ожидаемо, ботай, как обычно хранятся такие числа с плавающей точкой.
P.S. И всякие 'iostream.h' и 'cout <<' тут как-то совсем на C не тянут :]

dhifu9

Проблема на стадии вывода?

ppplva

Нет. Это действительно не ноль.

Ober

Нет, при вычислениях. Здесь так получается, что эти числа не могут храниться точно (т.к. в двоичной системе счисления они выражаются бесконечной двоичной дробью и может получаться ошибка, когда вычитаешь два очень близких числа (или складываешь два числа разного знака, но близких по модулю).

dhifu9

Эта проблема как-нить решается.Ведь ошибка даже небольшая может накопиться допустим при большом числе итераций.

evgen5555

Проставь галочку увеличенной точности floating point при компиляции.

Olenenok

иди ботай

Ober

Тут книжки надо по численным методам читать, и учиться оценивать ошибки в вычислениях Иногда можно упорядочивать операции таким образом, что ошибка будет меньше.
Я же правильно понимаю, что ты какой-то численный метод пишешь?

dhifu9

Да,численный метод. Спасибо за советы всем,кроме Joe Bishop.

Olenenok

а ты зря так, мой совет здесь самый верный

Oper

Я же правильно понимаю, что ты какой-то численный метод пишешь?
фегасе интуицея, по такому кусочку кода определить его предназначение
Может подскажешь заодно формулу для невязки, чтоб человек не мучался с ошибками округлений ?

Ober

фегасе интуицея, по такому кусочку кода определить его предназначение
Давай не будем путать интуицию и телепатию, ок?

slonishka

Давай не будем путать интуицию и телепатию, ок?
ыыы!

Helga87

Да, я тоже записал в блокнотик

artimon

+1
Оставить комментарий
Имя или ник:
Комментарий: