Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сравнение double  (Прочитано 19418 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 17-02-2013 09:06 » 

вот такой диалог с коллегой



а проканает ли ?

Добавлено через 5 минут и 35 секунд:
лично я, конечно, против таких влобных хаков

* Безымянный.png (4.95 Кб - загружено 1569 раз.)
« Последнее редактирование: 17-02-2013 09:12 от Алексей1153 » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 17-02-2013 09:16 » 

и ещё , насколько корректен будет вот такой нехитрый способ?

Код:
if( !(a<b) && !(a>b))
{
//равны
}
Записан

Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 17-02-2013 12:34 » 

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

Оценивать целесообразно лишь модуль разности между двумя числами (абсолютное либо относительное значение в зависимости от задачи). Если он укладывается в заданный диапазон, числа можно считать равными.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 17-02-2013 14:13 » 

Dale,

1 )подскажи, как уговорить коллегу не пользоваться memcmp , а применять точность при сравнении ? Ведь, по сути, если байты одинаковые, то и числа одинаковые - как я могу это опровергнуть Улыбаюсь

2) и всё-таки, про пост #1 можно комментарии ?
« Последнее редактирование: 17-02-2013 14:16 от Алексей++ » Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 17-02-2013 15:09 » 

Алексей++, цель-то какая? Ради чего сравниваются числа? И что эти числа означают?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 17-02-2013 18:28 » 

Dale,

1 )подскажи, как уговорить коллегу не пользоваться memcmp , а применять точность при сравнении ?

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

Ведь, по сути, если байты одинаковые, то и числа одинаковые - как я могу это опровергнуть Улыбаюсь

Хотя бы тот факт, что стандарт IEEE 754 допускает два представления нуля:
Код:
00 00 00 00 = +0
80 00 00 00 = -0
Побитовое сравнение скажет, что положительный и отрицительный нули не равны, что есть нонсенс.

2) и всё-таки, про пост #1 можно комментарии ?

Небольшой этюд на тему чисел с плавающей точкой:

Код:
#include <stdio.h>

int main(void)
{
  double a = 17.0;
  double b = 13.0;
  double c = a / b;

  double d = 0.0;
  for (int i = 0; i < 13; i++)
    d += c;

  double e = d - a;

  printf("%25.18e %25.18e %25.18e %25.18e %25.18e\n", a, b, c, d, e);
  return 0;
}

Результат высполнения кода:
1.700000000000000000e+001 1.300000000000000000e+001 1.307692307692307700e+000 1.700000000000000400e+001 3.552713678800500900e-015

Делим 17 на 13, затем результат складываем с самим собой 13 раз - и получаем число, отличающееся от исходного на небольшую, но тем не менее ненулевую величину. Арифметика утверждает, что результаты должны быть равны, программа - что это разные числа (если сравнивать побитно).

На практике числа, отличающиеся в 16-м знаке после точки, в большинстве приложений разумно считать равными (есть исключения, например, в случае научных расчетов при плохой сходимости, но это скорее экзотика, вряд ли Ваша задача из таких).
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 17-02-2013 19:01 » 

Offtopic:
Dale, А вдруг они делают программу-навигатор космических межзвездеых кораблей. Там ошибка даже в 16 знаке может привести не туда Отлично
Поставлю в угол.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 17-02-2013 19:37 » 

Dale, А вдруг они делают программу-навигатор космических межзвездеых кораблей. Там ошибка даже в 16 знаке может привести не туда Отлично

Вряд ли.

Парсек равен 3,0856776e16 м. Даже если коллеги Алексей++ собираются лететь на Проксиму Центавра, ошибка в 16-м знаке даст примерно 5 метров. В крайнем случае пешком прогуляются. Если, конечно, они не целились ракетой тамошней мухе в глаз, тогда провал операции.

Кстати, "Вояджер-1" делает 17.5 микропарсек в год. За все время полета ошибка округления не превысит миллиметра.

Про куда более существенные последствия ошибки округления я приводил статью: https://forum.shelek.ru/index.php/topic,28557.msg279216.html#msg279216
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 17-02-2013 20:56 » 

Леш, такой боян...
http://wiki.shelek.ru/index.php/FAQ:ANSI_CPP:%D1%81%D1%80%D0%B0%D0%B2%D0%BD%D0%B8%D1%82%D1%8C_%D0%B4%D0%B2%D0%B0_%D1%87%D0%B8%D1%81%D0%BB%D0%B0_%D1%82%D0%B8%D0%BF%D0%B0_double
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 18-02-2013 03:22 » 

усё, понял примерно )

Добавлено через 3 минуты и 44 секунды:
Dimka, моделируется работа САУ

Добавлено через 6 минут и 15 секунд:
Ром, насчёт того, какую точность выбрать - тут как-то надо от величины самих чисел плясать, так как они могут быть и больше 0.0001 и меньше

к примеру, какой-то процент разницы сравнивать с точностью
« Последнее редактирование: 18-02-2013 03:32 от Алексей1153 » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 18-02-2013 05:47 » 

На мой взгляд затруднение вызвано неточность задания, а не самим сравнением. Леш, уточни требования и от этого найдешь подходящее решение.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 18-02-2013 05:55 » 

уже решили взять постоянную точность
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 18-02-2013 07:24 » new

Алексей++, для САУ надо сравнивать как Dale говорит, а не бит в бит. Если, конечно, целью управления являются значения этих double, а не контроль сохранности их битов.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 20-02-2013 05:52 » 

Dimka, да я то понимаю, задача была - убедить коллэгу, поскольку егу не устраивало "так не делают" Улыбаюсь
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines