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

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

Войти
Регистрация
Восстановить пароль
 
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
#1

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

03.02.2014, 21:49. Просмотров 993. Ответов 10
Метки нет (Все метки)

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

Ошибка: 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; ...

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

Исправить ошибки "cannot convert 'double (*)(double)' to 'double'" и "too many arguments to function" - C++
пожалуйста проверьте и помогите исправить ошибки: #include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;math.h&gt; #include&lt;stdlib.h&gt; ...

Почему перестает работать программа при замене double на long double? - C++
Здравствуйте! Прошу помощи чтобы разобраться в следующем вопросе: Нашел программу в интернете, запустил - все работает, но когда решил...

Преобразовать 2 числа int в 1 число float(double) | double int1.int2 - C++
Всем привет. Изучая азы C++, столкнулся с такой проблемой. Есть два значения типа int, их необходимо преобразовать в одно значение типа...

10
Enotniy
96 / 95 / 14
Регистрация: 15.01.2014
Сообщений: 283
03.02.2014, 22:13 #2
dzrkot, дело в погрешности операции вычитания (самая большая погрешность)
надо учитывать так называемый "машинный эпсилон" – относительная погрешность представления чисел. он равен кажется равен http://www.cyberforum.ru/cgi-bin/latex.cgi?{2}^{-8},никак не избавится надо проверять промежуток, или проверять ответ ( подставлять 0)
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 22:25 #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"); 
}
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
03.02.2014, 22:33  [ТС] #4
посмотрю завтра, секйчас уже сплю, но вспомнил что где-то видел такую вещь, как +1 к правой и левой стороне и сравнивали уже с 1(хотя не помню с этим ли было это связано или нет)
0
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 267
03.02.2014, 22:45 #5
Я проверяю на
C
1
fabs(d)<eps
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 22:50 #6
Цитата Сообщение от AndrSlav Посмотреть сообщение
Я проверяю на
C++
1
fabs(d)<eps
eps откуда берешь?
0
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 267
03.02.2014, 22:57 #7
Это от задачи зависит, считается, что изменением результата на eps можно уже пренебречь. Если подсчитывается число молекул, то eps может быть очень большим, при решении СЛУ методом последовательных приближений - противоположная ситуация.
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 23:03 #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 может быть очень большим, при решении СЛУ методом последовательных приближений - противоположная ситуация.
Так то оно так!!! Но эта величина ограничена еще возможностями компьютера посмотри мой последний код. Он как раз рассчитывает ее возможное значение!
0
daslex
03.02.2014, 23:14
  #9

Не по теме:

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

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

0
AndrSlav
44 / 44 / 6
Регистрация: 20.12.2013
Сообщений: 267
03.02.2014, 23:15 #10
Понятное дело, складываются числа с разными порядками- уменьшается точность вычислений.
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.02.2014, 23:27 #11
Цитата Сообщение от daslex Посмотреть сообщение
в зависимости от разрядности процессора, точность вычислений может увеличиваться
скорее тут речь идет об ограничении типа переменной, а точнее сказать об объеме памяти отводимого на мантиссу данного типа.
0
03.02.2014, 23:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 23:27
Привет! Вот еще темы с ответами:

Какая-нибудь реализация функции void Fun (double in, double *out) - C++
Подскажите, пожалуйста, какую-нибудь любую реализацию прототипа функции: void Fun (double in, double *out)

long double и double в MSVC 12 одно и тоже, нужна информация,желательно быстрей - C++
Здравствуйте все знают что в VC long double и double одно и тоже, да и при простой проверке это легко выясняется, но нужна информация от...

invalid operands of types ‘double*’ and ‘double’ to binary ‘operator*’ - C++
#include &quot;mpi.h&quot; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #define count 120 int main(int argc,char *argv) { ...

std::copy из vector<double> в *double, непонятный warning - C++
double myD={10,20,30,40,50,60,70}; std::vector&lt;double&gt; myvector (7); std::copy ( myD, myD+7, myvector.begin() ); std::copy (...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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