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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.87
iama
1249 / 974 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
#1

Минус ноль - C++

17.06.2011, 12:42. Просмотров 3037. Ответов 14
Метки нет (Все метки)

Товарищи, ничего не соображаю.
Элементарная программа выводит корни квадратного уравнения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
int main()
{
        double a, b, c;
 
        cin >> a >> b >> c;
        
        if (b * b == 4 * a * c) 
            cout << fixed << setprecision(6) << -b / (2*a);
        else 
            cout << fixed << setprecision(6) << (-b - sqrt(b * b - 4 * a * c)) / (2*a) 
            << ' ' << (-b + sqrt(b * b - 4 * a * c)) / (2*a);
        
        //system("pause");
 
        return 0;
}
Все бы хорошо, да что-то с точностью, видать, при вводе
1 0 0
Ответом выходит -0. Тут что, поиск машинного ипсилон прописывать, и сравнивать с ним +-ноль, или что? Такое чувство, что я где-то жестоко туплю.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2011, 12:42     Минус ноль
Посмотрите здесь:

Заполнить массив единицами и минус единицами и поменять единицы и минус единицы местами - C++
Помогите решить задачу,не могу понять как заполнить массив единицами и минус единицами в случайном порядке без нулей.

Фальшивый минус - C++
Попробовал скомпилировать исходник к книге Р.Лафоре &quot;Объектно-ориентированное программирование в C++&quot;. Ошибок в исходниках к этой книге...

Унарный минус на С# - C++
Всем доброго времени суток,помогите пожалуйста с задачкой. (i-мнимая единица) Условие: а=3+4i c=-a a=-3-4i Заранее спасибо:)

Степень минус единицы - C++
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; #include &lt;cmath&gt; #include &lt;conio.h&gt; using namespace std; double...

Оператор (-) Унарный минус. классы. - C++
Доброе время суток . помогите . составить operator- (унарный минус) ( что бы координаты x и y были отрицательными .( немогу понять как...

Как убрать знак минус - C++
У меня int a = -7. Как программно получить a = 7?

представление чисел со знаком минус - C++
Допустим у нас есть такое число в десятичной системе счисления: -134. В шестнадцатеричной системе счисления число 134 равно 086. А как это...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
tylix
68 / 55 / 6
Регистрация: 10.06.2011
Сообщений: 149
17.06.2011, 13:02     Минус ноль #2
lol (-0 < 0)
может там на самом деле -0.0000000000000001000 какой нибудь
Imate
120 / 76 / 8
Регистрация: 08.06.2011
Сообщений: 267
17.06.2011, 13:06     Минус ноль #3
C++
1
if (b * b == 4 * a * c)
я бы так не делал. когда-то мой учитель говорил мне что не следует сравнивать два дробных числа на равенство, нужно ввести эпсилон и проверить на больше/меньше.
стандарт IEEE 754 описывает ноль со знаком.
C++
1
-b / (2*a);
замените на числа
C++
1
-0.0f / (2*1.0f);
вот и минус ноль
http://en.wikipedia.org/wiki/Signed_zero
iama
1249 / 974 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
17.06.2011, 13:07  [ТС]     Минус ноль #4
tylix, понятно, что это так, как от этого избавиться?
Imate
120 / 76 / 8
Регистрация: 08.06.2011
Сообщений: 267
17.06.2011, 13:08     Минус ноль #5
C++
1
double fabs ( double x );
iama
1249 / 974 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
17.06.2011, 13:12  [ТС]     Минус ноль #6
Цитата Сообщение от Imate Посмотреть сообщение
я бы так не делал. когда-то мой учитель говорил мне что не следует сравнивать два дробных числа на равенство, нужно ввести эпсилон и проверить на больше/меньше
Да, конечно так, но в этой проблемме это несущественно, меня интересует минус ноль
Цитата Сообщение от Imate Посмотреть сообщение
замените на числа
Код C++1 -0.0f / (2*1.0f);
У меня переменные обьявлены как double, целочисленная арифметика тут применяться не будет
Цитата Сообщение от Imate Посмотреть сообщение
вот и минус ноль
http://en.wikipedia.org/wiki/Signed_zero
Читал, и не нашел ничего, что помогло бы мне красиво выйти из этой ситуации

Добавлено через 36 секунд
Цитата Сообщение от Imate Посмотреть сообщение
double fabs ( double x );
Да ну? А если корень отрицательный будет?

Добавлено через 28 секунд
Стало быть, только ипсилон прописывать? Наверняка как-то красивей можно сделать
Imate
120 / 76 / 8
Регистрация: 08.06.2011
Сообщений: 267
17.06.2011, 13:15     Минус ноль #7
Цитата Сообщение от iama Посмотреть сообщение
У меня переменные обьявлены как double, целочисленная арифметика тут применяться не будет
а в каком месте я по целые числа писал? это все дробные числа
iama
1249 / 974 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
17.06.2011, 13:24  [ТС]     Минус ноль #8
Цитата Сообщение от Imate Посмотреть сообщение
а в каком месте я по целые числа писал? это все дробные числа
Ну и смысл тогда в дробных коэфициентах?

Добавлено через 5 минут
Решил некрасиво
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
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
int main()
{
        double a, b, c;
 
        cin >> a >> b >> c;
        
        if (b * b - 4 * a * c < 0.000001) 
            if (-b / (2*a) != -0) cout << fixed << setprecision(6) << -b / (2*a);
            else cout << 0;
        else 
        {
            cout << fixed << setprecision(6);
            if ((-b - sqrt(b * b - 4 * a * c)) / (2*a) != -0)
                cout << (-b - sqrt(b * b - 4 * a * c)) / (2*a) << ' '; 
            else
                cout << 0 << ' ';
 
            if ((-b + sqrt(b * b - 4 * a * c)) / (2*a) != -0)
                cout << (-b + sqrt(b * b - 4 * a * c)) / (2*a) << ' '; 
            else
                cout << 0 << ' ';
        }
        
        //system("pause");
 
        return 0;
}
Imate
120 / 76 / 8
Регистрация: 08.06.2011
Сообщений: 267
17.06.2011, 13:26     Минус ноль #9
вы про то что я записал -0.0f, а не просто -0?
так это просто привычка явно указывать тип данных и все
а по теме, используйте эпсилон, в чем проблема?
iama
1249 / 974 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
17.06.2011, 13:29  [ТС]     Минус ноль #10
Imate, да блин, такая простая задача, и ипсилон. Ладно, чо уж тут делать...
Imate
120 / 76 / 8
Регистрация: 08.06.2011
Сообщений: 267
17.06.2011, 13:45     Минус ноль #11
кстати, тот мой учитель на этой же задаче вроде про эпсилон и рассказал
мой вариант решения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
int main()
{
                double a, b, c;
 
                cin >> a >> b >> c;
 
                if (fabs(b * b - 4 * a * c) < 0.00001)
                        (-b/(2*a)<0) ? cout << fixed << setprecision(6) << -b / (2*a) : cout << 0;
                else
                        (fabs((-b - sqrt(b * b - 4 * a * c)) / (2*a))<0.00001) ? cout << fixed << setprecision(6) << (-b - sqrt(b * b - 4 * a * c)) / (2*a) : cout << 0;
                        (fabs((-b + sqrt(b * b - 4 * a * c)) / (2*a))<0.00001) ? cout << fixed << setprecision(6) << (-b + sqrt(b * b - 4 * a * c)) / (2*a) : cout << 0;
 
                //system("pause");
 
        return 0;
}

красивее
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.06.2011, 16:00     Минус ноль #12
Отрицательным корень не будет. Инфа 100%
Делаем вид, что мнимых чисел не существует.
iama
1249 / 974 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
17.06.2011, 19:05  [ТС]     Минус ноль #13
Deviaphan, каким будет корень уравнения x^2 + 2x + 1 ?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.06.2011, 19:10     Минус ноль #14
А корень это не sqrt? .)
Дайте ссылку на математику за пятый класс.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2011, 19:12     Минус ноль
Еще ссылки по теме:

Как правильно перегружать унарный минус? - C++
Дайте правильный прототип перегрузки унарного минуса.

Нужно чтобы принимал минус перед нулем - C++
Если ввести -00043 то работает, а вот если -000000000000000000000000000005353 то нет, потому что берет минус и первые 16 нолей и пишет что...

Шаблон класса. Помогите описать бинарный минус - C++
Помогите описать бинарный минус Код: #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; template &lt;class ku&gt; class...

Как сделать, чтобы калькулятор реагировал на унарный минус - C++
подскажите, как сделать, чтобы этот калькулятор реагировал на унарный минус? int prior(char c) { int a; if (c=='+' || c=='-')...

Как вызвать в главной программе оператор унарный минус - C++
Paint operator-(const Paint&amp; p) { return Paint(-p.x,-p.y); }


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

Или воспользуйтесь поиском по форуму:
iama
1249 / 974 / 49
Регистрация: 30.07.2010
Сообщений: 5,297
17.06.2011, 19:12  [ТС]     Минус ноль #15
Deviaphan, коли у вас такой оригинальный способ мышления, поясню, имелся в виду корень многочлена
Yandex
Объявления
17.06.2011, 19:12     Минус ноль
Ответ Создать тему
Опции темы

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