Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: Уроки по C++. Обсуждение.  (Прочитано 17469 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #45 : 29 Октября 2013, 19:11:12 »
soarin, ну тогда уж сразу long double, чего уж мелочиться...

Если бы у нас стояло задание посчитать с точностью до 5 знака после запятой, мы бы не так считали бы все вычисления.
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1850
  • ubuntu 20.04
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #46 : 29 Октября 2013, 19:14:22 »
soarin, ну тогда уж сразу long double, чего уж мелочиться...
жирно, а промежуточные вычисления должны выполнять с типами с большей точностью.

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #47 : 29 Октября 2013, 19:57:59 »
soarin, ну тогда уж сразу long double, чего уж мелочиться...
жирно, а промежуточные вычисления должны выполнять с типами с большей точностью.

как не крути а эти вычисления(промежуточные) будут существовать(
Покой – это не место, где тихо и мирно, где нет шума и беспокойства.
Покой – это когда при всем этом, вы сохраняете мир и спокойствие в своем сердце.

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #48 : 29 Октября 2013, 20:05:00 »
inkblack,
На счет ошибки округления не понял:

Код: (text) [Выделить]
sol@eee:~/cpp-lessons$ ./accu
Введите 3 действительных числа
являющихся коэффициентами квадратного уравнения: 3 1.999999999999999 .333333333333333
Дискриминант уравнения равен -2.22045e-16.
Уравнение не имеет действительных корней.

А на самом деле дискриминант равен 1E-30 :-\.

И в случае более сложных уравнений даже и long double
не поможет, нужны другие методы.

peregrine, я поправил:
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 04 Ноября 2013, 00:32:46 от inkblack »
Делюсь знаниями, но их у меня мало!

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #49 : 29 Октября 2013, 20:09:46 »
inkblack,
я только одного не пойму. Зачем так:
Цитировать
std::cout << " отличаются на " << -diff << std::endl;

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1850
  • ubuntu 20.04
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #50 : 29 Октября 2013, 20:21:19 »
inkblack,
Ещё смешнее
diff = abs(a-b);
std::cout << "Числа " <<a<< " и " <<b;
if (diff==0) {
        std::cout << " равны." << std::endl;       
} else {
        std::cout << " отличаются на " << diff << std::endl;
}
« Последнее редактирование: 29 Октября 2013, 20:40:06 от soarin »

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #51 : 29 Октября 2013, 20:26:28 »
soarin,
ещё смешнее. У вас ошибка. Если так делать, то надо так:
Код: (cpp) [Выделить]
diff = abs(a-b);
std::cout << "Числа " <<a<< " и " <<b;
if (diff==0)
  {
    std::cout << " равны." << std::endl;       
  }
else
  {
    std::cout << " отличаются на " << diff << std::endl;
  }
Зачем if(diff=0) пишите? Это же ложь всегда будет.

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #52 : 29 Октября 2013, 20:29:14 »
soarin, а для abs нужен какой-нибудь include?

peregrine, а чему равна разность чисел 7 и 8?
Делюсь знаниями, но их у меня мало!

Оффлайн soarin

  • Старожил
  • *
  • Сообщений: 1850
  • ubuntu 20.04
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #53 : 29 Октября 2013, 20:39:47 »
Зачем if(diff=0) пишите?
Потому что невнимательность over 9500. От чего часто и страдаю :/
« Последнее редактирование: 29 Октября 2013, 20:41:46 от soarin »

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #54 : 29 Октября 2013, 21:02:44 »
inkblack, понял, зачем, но abs тут действительно лучше, чем конструкция с if, т.к. abs просто отбрасывает знак минуса в двоичной записи числа и ничего не сравнивает (конечно от реализации зависит, может кто и с if нагородит огород). Работать должно быстрее, в теории. Надо заголовочный файл подключать #include <cmath>, и тогда уже std::abs(a-b). Т.е. вся программа так правильно будет:
(Нажмите, чтобы показать/скрыть)

Пользователь решил продолжить мысль 29 Октября 2013, 21:14:43:
PS
inkblack, зачем главную функцию объявляете
int main(void)
можно просто
int main()
Это же C++, а не C. Разницы нет, а зачем писать больше?
« Последнее редактирование: 29 Октября 2013, 21:14:43 от peregrine »

Оффлайн RingOV

  • Активист
  • *
  • Сообщений: 764
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #55 : 29 Октября 2013, 21:40:45 »
А если так? Ведь все-равно иррациональное число не записать в виде конечной десятичной дроби.
(Нажмите, чтобы показать/скрыть)

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5583
  • Все по палатам!
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #56 : 29 Октября 2013, 23:27:00 »
RingOV,
Дети же могут прочитать это. Исправьте уже
if (D == 0)
Нельзя сравнивать результат вычислений с плавающей запятой с 0.
Извините, я все еще учусь

Оффлайн peregrine

  • Автор темы
  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7203
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #57 : 29 Октября 2013, 23:50:02 »
RingOV, как нельзя сравнивать и числа с плавающей точкой друг с другом. Так как равенство может быть только с какой-то точностью.

Оффлайн JmAbuDabi

  • Старожил
  • *
  • Сообщений: 2468
  • 나는 빅터 해요. 나는 프로그래머입니다
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #58 : 30 Октября 2013, 00:19:19 »
RingOV,
Дети же могут прочитать это. Исправьте уже
if (D == 0)
Нельзя сравнивать результат вычислений с плавающей запятой с 0.

т.е if (D > 0) возможно, а if (D == 0) нет?

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

Оффлайн SergeyIT

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5583
  • Все по палатам!
    • Просмотр профиля
Re: Уроки по C++. Обсуждение.
« Ответ #59 : 30 Октября 2013, 00:23:37 »
JmAbuDabi,
Я же выше уже писал
"читать http://habrahabr.ru/post/112953/
и в гугле искать "сравнение чисел с плавающей точкой" "
Извините, я все еще учусь

 

Страница сгенерирована за 0.033 секунд. Запросов: 25.