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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
#1

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

06.12.2012, 04:14. Просмотров 351. Ответов 5

Приветствую! Недавно делая простую программу встретился с проблемой - при работе с числами типа 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
Ну а результат виден на скриншоте.
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2012, 04:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка в double (C++):

Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double Akk(double x, double y, double z); int main() { int a, b, c; ...

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double - C++
Думаю из-за polp #include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;cstdlib&gt; using namespace std; double polp(double af,double...

Ошибка: невозможно преобразовать 'double' в 'double' - C++
Задача алгоритма, мы вводим матрицу А и В матрицу А раскладываем в LU разложение и с его помощью находим обратную матрицу, а после находим...

Шаблон класса complex. Ошибка undefined reference to `complex<double>::SetRe(double)' - C++
Есть такой файл complex.h #ifndef COMPLEX_H #define COMPLEX_H template&lt;class Type&gt; class complex{ public: Type Re; Type...

Почему мы пишем double x (double y)? а не через запятую double x,y - C++
почему мы пишем double x (double y)? а не через запятую double x,y

Ошибка "Невозможно преобразовать аргумент 1 из "double" в "double *" - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double f(double *a, double x) { double k = 0; int n; for (int i = 0;...

5
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
06.12.2012, 04:20 #2
Цитата Сообщение от iRomul Посмотреть сообщение
cout.precision(20);
источник бед если не вдаваться вподробности IEEE754. Установи меньше и будет нормально.
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
06.12.2012, 04:22  [ТС] #3
activnaya, вся проблема в том, что мне нужно проверить число на ноль, но как мне это сделать?
0
activnaya
255 / 45 / 2
Регистрация: 24.11.2012
Сообщений: 466
06.12.2012, 04:30 #4
Цитата Сообщение от iRomul Посмотреть сообщение
вся проблема в том, что мне нужно проверить число на ноль, но как мне это сделать?
абсолютный ноль в числах с порядком и мантиссами не существует. Есть допустимая погрешность. Она конечно очень мала, но имеет свойство накапливания.

Добавлено через 4 минуты
Цитата Сообщение от iRomul Посмотреть сообщение
но как мне это сделать?
в c99 есть макросы для сравнения чисел с плавающей точкой. Не знаю как они реализованы, н ознаю что есть.
0
iRomul
159 / 100 / 11
Регистрация: 17.10.2012
Сообщений: 480
Завершенные тесты: 1
06.12.2012, 15:35  [ТС] #5
activnaya, хорошо, ну а есть какие-то способы решить мою задачу? Может как-то отрезать (округлить) часть с погрешностью? Или другой тип данных выбрать?
Хорошо, попробую поискать, спасибо!
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
06.12.2012, 15:55 #6
Цитата Сообщение от iRomul Посмотреть сообщение
мне нужно проверить число на ноль, но как мне это сделать?
C++
1
const double eps=1e-4;
C++
1
if (n<eps && n>-eps)
C++
1
if (fabs(n)<eps)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2012, 15:55
Привет! Вот еще темы с ответами:

Ошибка с double - C++
Здравствуйте, есть такая проблема. Создал цикл: for(double и = 0.0; и &lt; 100000; и = и + 0.1) но как ни странно, в double число...

Ошибка в преобразовании строки в double - C++
Почему вот тут все правильно, то есть 5.5 остается 5.5: #include &lt;iostream&gt; void main( int ArgC, char *ArgV ) { char *str = new...

Ошибка в переменной типа double - C++
Не могу понять в чем проблема делаю такие вычисления #include &lt;iomanip&gt; summ5=0; summ5+=((double) 1/1035*2); ...

Ошибка вывода значения 0 типа double - C++
При выполнении этого кода при значении x=0 не выводится четкий ноль. Почему? Я так понимаю нужно проводить округление? С printf такого нет....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Yandex
Объявления
06.12.2012, 15:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru