Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прокомментируйте код, пожалуйста 
:(
    Опции темы
Crafty
Дата 1.4.2013, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 2
Всего: 14



Цитата(Guinness @  1.4.2013,  14:37 Найти цитируемый пост)
Разве?

http://liveworkspace.org

Добавлено через 4 минуты и 27 секунд
Цитата(Guinness @  1.4.2013,  14:37 Найти цитируемый пост)
 В Вашем же случае, нужно постоянно менять эпсилон, чтобы понимать в каком знаке Вы хотите совпадения.

Эпсилон это всего лишь точность с которой ты хочешь сравнивать числа, и не надо ничего менять.
PM MAIL   Вверх
borisbn
Дата 1.4.2013, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(noize @  1.4.2013,  14:02 Найти цитируемый пост)
это справедливо и для float ?

в ещё бОльшей степени, чем для double.
Дело в том, что числа с плавающей точкой хранятся в компьютере след.образом:
user posted image
где fraction - это доля числа от 0 до 1 ( 52 нуля - это 0, 52 единицы - это 1, единица и 51 нуль - это примерно 0,5).
Минимальное расстояние между двумя числами 2^-52. Представь себе шкалу, с делениями 0, 2^-52, 2*2^-52, 3*2^-52 и т.д.
Если число, записанное в привычной тебе (и мне)) десятичной системе (например 0,1), попытаться положить на эту шкалу, то оно ляжет между двумя делениями (за исключением случаев точного попадания). При разборе такого кода:
Код
double x = 0.1;

компилятор "кладёт" это число на шкалу, затем берёт ближайшее значение из шкалы и записывает его в x. Т.о. в x помещается не 0,1, а ближайшее к нему (0.1000000000000000055511151).
Фух... я выдохся ))

Добавлено через 2 минуты и 50 секунд
Вот - почитай

Это сообщение отредактировал(а) borisbn - 1.4.2013, 14:50


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Guinness
Дата 1.4.2013, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Цитата(Crafty @  1.4.2013,  14:41 Найти цитируемый пост)
Цитата(Guinness @  1.4.2013,  14:37 )Разве?http://liveworkspace.orgДобавлено через 4 минуты и 27 секундЦитата(Guinness @  1.4.2013,  14:37 ) В Вашем же случае, нужно постоянно менять эпсилон, чтобы понимать в каком знаке Вы хотите совпадения.Эпсилон это всего лишь точность с которой ты хочешь сравнивать числа, и не надо ничего менять.


Пардон, нужно fabs использовать. http://liveworkspace.org/code/2JEbmD$8

По поводу, не надо ничего менять. Я не согласен. Потому что, если вы ещё раз посмотрите пример, который я привел, то поймете, что в случае с Вашим использщованием эпсилон, сравнение некорректно.
PM MAIL   Вверх
Crafty
Дата 1.4.2013, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 2
Всего: 14



Цитата(Guinness @  1.4.2013,  14:53 Найти цитируемый пост)
По поводу, не надо ничего менять. Я не согласен. Потому что, если вы ещё раз посмотрите пример, который я привел, то поймете, что в случае с Вашим использщованием эпсилон, сравнение некорректно. 

Почему некорректно, сама идея в эпсилоне в том, что мы точно знаем какую точность нам надо учитывать, допустим эпсилон равен 0.0001 то мы уверены, что разница в числе не должна быть больше чем 0.0001 иначе они не равны.
Эпсилон всегда можно сделать достаточно маленьким.
PM MAIL   Вверх
Guinness
Дата 1.4.2013, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Цитата(Crafty @  1.4.2013,  15:11 Найти цитируемый пост)
Почему некорректно, сама идея в эпсилоне в том, что мы точно знаем какую точность нам надо учитывать, допустим эпсилон равен 0.0001 то мы уверены, что разница в числе не должна быть больше чем 0.0001 иначе они не равны.Эпсилон всегда можно сделать достаточно маленьким.


О том и речь. Что эпсилон Вам нужно будет менять в зависимости от размера сравниваемых чисел. Иначе получится такая петрушка:
Код

eps = 0.001
a = 1.002 и b = 1.0011 - равны
и
a = 0.002 и b = 0.0011 - также равны
-------------------------------------------
a = 1,00000001*10^10 и b=1.0*10^10 - неравны


Хотя, я понял Вашу мысль. Но я бы считал сравнение в приведенном выше примере - некорректным.

Это сообщение отредактировал(а) Guinness - 1.4.2013, 15:23
PM MAIL   Вверх
borisbn
Дата 1.4.2013, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Цитата(Guinness @  1.4.2013,  15:16 Найти цитируемый пост)
eps = 0.001
a = 1.002 и b = 1.0011 - равны
и
a = 0.002 и b = 0.0011 - также равны
-------------------------------------------
a = 1,00000001*10^10 и b=1.0*10^10 - неравны

ну... как бэ... да. а что смущает ?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Guinness
Дата 1.4.2013, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: нет
Всего: 10



Цитата(borisbn @  1.4.2013,  15:49 Найти цитируемый пост)
ну... как бэ... да. а что смущает ?


В зависимости от того, что Вы хотите получить. Мне при сравнении чисел важно определенное количество знаков после первой значащей цифры, а не после запятой. И вариант, когда 0,002 = 0,0011, и при этом a = 1,00000001*10^10 и b=1.0*10^10, которые намного ближе друг к другу по значению - неравны, я считаю неприемлимым.

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

Это сообщение отредактировал(а) Guinness - 1.4.2013, 15:57
PM MAIL   Вверх
fish9370
Дата 1.4.2013, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(noize @  1.4.2013,  14:40 Найти цитируемый пост)
а как же утверждение о том, что стандарт языка гарантирует 6 цифр после мантиссы для float и n-ое количество цифр для double? 


постараюсь расшифровать, то что пытаются тебе тут донести

если ты возьмешь и сделаешь так:

Код

double c = 0.0000001;
double d = 0.0000001;
if (c == f)
      printf("c & d are equal\n");


естественно, эти два числа будут равны, это у тебя по условию (ты сам туда записал два одинаковых числа)

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

PS. спор возникший, следует закрывать, вы оба правы, только вы вычисляете разные вещи..

Это сообщение отредактировал(а) fish9370 - 1.4.2013, 17:08


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0838 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.