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

сравнить double с 0 - C++

Восстановить пароль Регистрация
 
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
03.02.2014, 21:49     сравнить double с 0 #1
спортивный интерес - наткнулся в вк, стало любопытно, а как правильно (хороший тон или стиль итп итд) сравнить double с 0, были варианты с (>= 0.000001 && <= 0.000001) и т.п. ...вопрос именно как это принято делать)
к примеру
C++
1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
using namespace std;
 
int main()
{
double a = 1.4641;
double b = 2.4200;
 
cout <<(b*b - 4*a);
    return 0;
}
выдает -0.000000...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Enotniy
 Аватар для Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
03.02.2014, 22:13     сравнить double с 0 #2
dzrkot, дело в погрешности операции вычитания (самая большая погрешность)
надо учитывать так называемый "машинный эпсилон" – относительная погрешность представления чисел. он равен кажется равен http://www.cyberforum.ru/cgi-bin/latex.cgi?{2}^{-8},никак не избавится надо проверять промежуток, или проверять ответ ( подставлять 0)
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 22:25     сравнить double с 0 #3
Посмотри результат:

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main ()
{
    double p,p1;
    p=1;
        p1=1; 
    while ((p1+p)!=1) {p/=10;}
    std::cout<<p<<std::endl;
    std::system("Pause"); 
}
Добавлено через 2 минуты
Но не все так просто а потом посмотри результат:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main ()
{
    double p,p1;
    p=1;
 
    while (p!=0) {p1=p; p/=10;}
    std::cout<<p1<<std::endl;
    std::system("Pause"); 
}
dzrkot
zzzZZZ...
 Аватар для dzrkot
516 / 346 / 53
Регистрация: 11.09.2013
Сообщений: 1,977
03.02.2014, 22:33  [ТС]     сравнить double с 0 #4
посмотрю завтра, секйчас уже сплю, но вспомнил что где-то видел такую вещь, как +1 к правой и левой стороне и сравнивали уже с 1(хотя не помню с этим ли было это связано или нет)
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 241
03.02.2014, 22:45     сравнить double с 0 #5
Я проверяю на
C
1
fabs(d)<eps
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 22:50     сравнить double с 0 #6
Цитата Сообщение от AndrSlav Посмотреть сообщение
Я проверяю на
C++
1
fabs(d)<eps
eps откуда берешь?
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 241
03.02.2014, 22:57     сравнить double с 0 #7
Это от задачи зависит, считается, что изменением результата на eps можно уже пренебречь. Если подсчитывается число молекул, то eps может быть очень большим, при решении СЛУ методом последовательных приближений - противоположная ситуация.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 23:03     сравнить double с 0 #8
А раз уж здесь зашла об этом речь выложу более общий пример:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
int main ()
{
    double p,p1;
    p=1;
        p1=1; //можете менять это значение на 0.1; 0.01; 10;100 и т.д. и посмотрите результат
    while ((p1+p)!=p1) {p/=10;}
    std::cout<<p<<std::endl;
    std::system("Pause"); 
}
Если надо объяснить обращайтесь

Добавлено через 2 минуты
Цитата Сообщение от AndrSlav Посмотреть сообщение
Это от задачи зависит, считается, что изменением результата на eps можно уже пренебречь. Если подсчитывается число молекул, то eps может быть очень большим, при решении СЛУ методом последовательных приближений - противоположная ситуация.
Так то оно так!!! Но эта величина ограничена еще возможностями компьютера посмотри мой последний код. Он как раз рассчитывает ее возможное значение!
daslex
03.02.2014, 23:14
  #9

Не по теме:

(>= 0.000001 && <= 0.000001) запись длиннее, а значит неудобнее. (уверен ли, что лишний раз набирая руками количество нулей совпадет с желаеым?),
в зависимости от разрядности процессора, точность вычислений может увеличиваться, но вариант с таким сравнением не даст эту возможность использовать (переписывать числа для каждой новой машины?).
иногда требуются вычисления действительно достаточно малых величин.

в некоторых задачах не требуется сравнение на сильно малые величины и можно обходится на сравнение с 0.003, например, но это только там где точность не на первом месте.

AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 241
03.02.2014, 23:15     сравнить double с 0 #10
Понятное дело, складываются числа с разными порядками- уменьшается точность вычислений.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 23:27     сравнить double с 0
Еще ссылки по теме:

C++ Вывести long double число без перевода в double
Почему перестает работать программа при замене double на long double? C++
Почему мы пишем double x (double y)? а не через запятую double x,y C++

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

Или воспользуйтесь поиском по форуму:
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 23:27     сравнить double с 0 #11
Цитата Сообщение от daslex Посмотреть сообщение
в зависимости от разрядности процессора, точность вычислений может увеличиваться
скорее тут речь идет об ограничении типа переменной, а точнее сказать об объеме памяти отводимого на мантиссу данного типа.
Yandex
Объявления
03.02.2014, 23:27     сравнить double с 0
Ответ Создать тему
Опции темы

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