Форум программистов, компьютерный форум CyberForum.ru

Ошибка в double - C++

Восстановить пароль Регистрация
 
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
06.12.2012, 04:14     Ошибка в double #1
Приветствую! Недавно делая простую программу встретился с проблемой - при работе с числами типа double возникают ошибки. Пример
C++
1
2
double a(-2), b(0.1);
a += b;
По идеи a должно быть равно -1.9, но вот что получаю я:
[IMG]http://s58.***********/i162/1212/95/e7a568fc4b6c.png[/IMG]

Как мне побороть такие ошибки? Вот код, если нужен:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    while (x < xend) { //x изначально равно -2
        
        if (!op) {
 
            ++op;
        
        } else {
 
            x += dx; //dx равен 0.1
 
        }
 
        if(x != 0.0)
        delta = residual(myctgx(x, e), ctg(x));
 
        cout.precision(20);
        cout.flags(ios::left);
 
        if (x == 0)     cout << "| " << setw(8) << x << " | INF" << endl;
        else            cout << "| " << setw(8) << x << " |  " << setw(12) << myctgx(x, e) << " | " << setw(12)  << ctg(x) << " | " << setw(11)  << delta << endl;
 
 
 
    } //while x < xend
Ну а результат виден на скриншоте.
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
06.12.2012, 04:20     Ошибка в double #2
Цитата Сообщение от iRomul Посмотреть сообщение
cout.precision(20);
источник бед если не вдаваться вподробности IEEE754. Установи меньше и будет нормально.
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
06.12.2012, 04:22  [ТС]     Ошибка в double #3
activnaya, вся проблема в том, что мне нужно проверить число на ноль, но как мне это сделать?
activnaya
 Аватар для activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
06.12.2012, 04:30     Ошибка в double #4
Цитата Сообщение от iRomul Посмотреть сообщение
вся проблема в том, что мне нужно проверить число на ноль, но как мне это сделать?
абсолютный ноль в числах с порядком и мантиссами не существует. Есть допустимая погрешность. Она конечно очень мала, но имеет свойство накапливания.

Добавлено через 4 минуты
Цитата Сообщение от iRomul Посмотреть сообщение
но как мне это сделать?
в c99 есть макросы для сравнения чисел с плавающей точкой. Не знаю как они реализованы, н ознаю что есть.
iRomul
 Аватар для iRomul
158 / 99 / 11
Регистрация: 17.10.2012
Сообщений: 474
Завершенные тесты: 1
06.12.2012, 15:35  [ТС]     Ошибка в double #5
activnaya, хорошо, ну а есть какие-то способы решить мою задачу? Может как-то отрезать (округлить) часть с погрешностью? Или другой тип данных выбрать?
Хорошо, попробую поискать, спасибо!
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
06.12.2012, 15:55     Ошибка в double #6
Цитата Сообщение от iRomul Посмотреть сообщение
мне нужно проверить число на ноль, но как мне это сделать?
C++
1
const double eps=1e-4;
C++
1
if (n<eps && n>-eps)
C++
1
if (fabs(n)<eps)
Yandex
Объявления
06.12.2012, 15:55     Ошибка в double
Ответ Создать тему

Метки
double, ошибка
Опции темы

Текущее время: 08:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru