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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнеиие двух float, ... 
:(
    Опции темы
gepard
  Дата 20.6.2005, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Как сделать САБЖ?

ЗЫ
Надо бы это в ФАК, а по поиску не нашёл ничего...


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Alastis
Дата 20.6.2005, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

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



то?smile


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
vadims
Дата 20.6.2005, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




Открыта новая юмористическя ветка ?

Когда презентация с фуршетом ??? smile



--------------------
Cpu not found ! Press any key for software emulation.
PM MAIL   Вверх
gepard
Дата 20.6.2005, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Alastis
Там сравнение идёт на асме, а мне надо простыми способами. Раньше была такая тема, но базу подчистили...
vadims
Юморист, а ты не в курсе, что ты не сможешь сравнить два float числа обычным "==" ?


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Alastis
Дата 20.6.2005, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 251
Регистрация: 15.11.2004
Где: Казахстан, Астана

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



gepard
может тогда
Код

fabs(value1 - value2) < delta

просто и сердито сравниваешь до определенной точности


--------------------
Прости, что я говорю, когда ты меня перебиваешь.
PM MAIL WWW ICQ   Вверх
gepard
Дата 20.6.2005, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Alastis
Есть три варианта: оба числа < 0, оба числа > 0 и они с разными знаками.
По твоим словам:
Цитата

fabs(0.5 - 0.5) <= 0.00001 - нормально
fabs(-0.5 - (-0.5)) <= 0.00001 - тоже покатит
fabs(0.5 - (- 0.5)) <= 0.00001 - никак не пойдёт
fabs(-0.5 - 0.5) <= 0.00001 - Тоже не покатит.

smile


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 20.6.2005, 08:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Вот пример удобного шаблона на C++, может пригодится.

Код

// сравнение с заданной точностью

template <class _Val,class _Prec>
class dcmp
{
public:
   typedef _Val  value_type;
   typedef _Prec prec_type;
   
public:
   template <class _Tp>
   dcmp(const _Tp& val): m_Val(val) {}

   bool operator== (const dcmp& rhs) const { return fabs (m_Val - rhs.m_Val) < prec_type::eps(); }
   bool operator!= (const dcmp& rhs) const { return !(*this == rhs) ; }
   bool operator<  (const dcmp& rhs) const { return *this != rhs && m_Val < rhs.m_Val ; }
   bool operator>  (const dcmp& rhs) const { return *this != rhs && m_Val > rhs.m_Val ; }
   bool operator<= (const dcmp& rhs) const { return *this == rhs || m_Val < rhs.m_Val ; }
   bool operator>= (const dcmp& rhs) const { return *this == rhs || m_Val > rhs.m_Val ; }

   friend bool operator== (const value_type& Val, const dcmp& rhs) { return dcmp(Val) == rhs ; }
   friend bool operator!= (const value_type& Val, const dcmp& rhs) { return dcmp(Val) != rhs ; }
   friend bool operator<  (const value_type& Val, const dcmp& rhs) { return dcmp(Val) < rhs ;  }
   friend bool operator>  (const value_type& Val, const dcmp& rhs) { return dcmp(Val) > rhs ;  }
   friend bool operator<= (const value_type& Val, const dcmp& rhs) { return dcmp(Val) <= rhs ; }
   friend bool operator>= (const value_type& Val, const dcmp& rhs) { return dcmp(Val) >= rhs ; }
   
private:
   value_type m_Val;
};

struct _FloatPrec
{
    static double eps() { return FLT_EPSILON; }
};

template<class _Val>
   inline dcmp<_Val,_FloatPrec> fcmp(const _Val& val) { return dcmp<_Val,_FloatPrec>(val); }


Использование:

Код

double a = ...,b = ...;
if (fcmp(a) != b)
{
}


Это код для MSVC.NET.
Раньше, в MSVC 6, допустимы были числовые параметры-шаблона типа double, и определение было чуть попроще...

Шаблон работает для любых типов, для которых определены арифметичесие операции (хотя бы часть).


--------------------
...
PM   Вверх
gepard
Дата 20.6.2005, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Earnest
Цитата

Код

bool operator== (const dcmp& rhs) const { return fabs (m_Val - rhs.m_Val) < prec_type::eps(); }


Смотри мой пост предыдущий


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Earnest
Дата 20.6.2005, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Что-то я не пойму, в чем проблема.
Если числа с разными знаками, но в пределах заданной точности, например +eps/2 и -eps/2, то они равны. Если нет - то нет. Или по-вашему, (0.5 == - 0.5) должно быть true ?


--------------------
...
PM   Вверх
gepard
Дата 20.6.2005, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Earnest
Проблема всё в том же - в сравнении двух чисел...


--------------------
Когда начинаются цифровые войны, а траффик разносит моё сознание по бесконечным просторам инета, подобно ветру, разносящему листву по полям, тогда и только тогда я чувствую себя свободным!
© Я, Берсерк, что значит - Неистовый. 
PM MAIL WWW ICQ   Вверх
Adil'
Дата 20.6.2005, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 15



gepard, что-то ты перемудрил: fabs(a-b)<delta - вполне нормальный способ сравнения. -0.5 не будет, и не должно равняться +0.5, если конечно delt'у единицей не делать.


--------------------
Удачи
PM MAIL WWW   Вверх
vadims
Дата 20.6.2005, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



gepard

Между прочим я действительно думал, что шутка,
а то, что операции с плавающей и целочисленной арифметикой - не одно и тоже - поверь мне проверил на себе не один раз

И все-таки как и Earnest не пойму, что именно в сравнении float тебя напрягает. Пример что ли приведи



--------------------
Cpu not found ! Press any key for software emulation.
PM MAIL   Вверх
_hunter
Дата 21.6.2005, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



тогда предложу такой вариант:
пишем функцию, которая выполняет 4 _макро-действия_:
1 -- если два чила меньше нуля -- меняем им знак и сравниваем разницу с точностью
2 -- если первое меньше 0, а второе больше -- какое меньше -- известно
3 -- если второе меньше 0, а первое больше -- какое меньше -- изветсно
4 -- сравниваем разницу с точностью


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Adil'
Дата 21.6.2005, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 15



_hunter, это что, продолжение шутки?


--------------------
Удачи
PM MAIL WWW   Вверх
_hunter
Дата 21.6.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



продолжение не продолжение, но раз человек просит -- чего бы не помогти... smile


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
pablo
Дата 27.6.2005, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



слушайте а как вам такой способ:

т.к float - 6 байтов, то первые 2 байта наверное идут под ехпоненту, остальные 4 под мантиссу.

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

Это только теоретическое предположение.


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
comcon1
Дата 27.6.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 12
Всего: 17



в смысле с конца по битикам?? и чем это лучше, чем просто вычитать и сравнивать??


--------------------
PM MAIL   Вверх
ManiaK
Дата 27.6.2005, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 5
Всего: 29



Для определения, что больше, а что - меньше, круче чем вычитанием для общего случая никак не сделаешь. По крайней мере, с банальной математической точки зрения я не вижу альтернативы...
PM MAIL WWW   Вверх
B2_Russia
Дата 27.6.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В доску свой :)
**


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

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



ваще проблемы нету - вся эта хрень
на первом занянии по ЧМам излагается..

float - маздай!!!
юзайте double !


Это сообщение отредактировал(а) B2_Russia - 27.6.2005, 15:25
PM WWW ICQ   Вверх
Earnest
Дата 27.6.2005, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(pablo @ 27.6.2005, 14:35)
т.к float - 6 байтов, то первые 2 байта наверное идут под ехпоненту, остальные 4 под мантиссу

В каком это компиляторе размер float составляет 6 байтов? До сих пор была уверена, что размер float == 4 байта, по крайней мере в VC и в Borland C.
Может, я от жизни отстала? smile



--------------------
...
PM   Вверх
Mayk
Дата 27.6.2005, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Ну насчет float Earnest права, sizeof(float) = 4.
А вот sizeof(double)=8. sizeof(long double)=80([offtop]бах, это случаем не variant из vb?[/offtop])
А вот про 48 битов упоминается в SUS2(SUS3 под рукой нет, но там кажется то же самое есть), например здесь:

Цитата

The Single UNIX ® Specification, Version 2
Copyright © 1997 The Open Group

--------------------------------------------------------------------------------

NAME
drand48, erand48, jrand48, lcong48, lrand48, mrand48, nrand48, seed48, srand48 - generate uniformly distributed pseudo-random numbers

SYNOPSIS


#include <stdlib.h>

double drand48(void);
double erand48(unsigned short int xsubi[3]);
....skip....

DESCRIPTION
This family of functions generates pseudo-random numbers using a linear congruential algorithm and 48-bit integer arithmetic.
The drand48() and erand48() functions return non-negative, double-precision, floating-point values, uniformly distributed over the interval [0.0 , 1.0].
....skip....


Однако хочется сказать,что наши родимые FPU оперируют только 32 битными, 64 битными и 80 битными типами.
Если кому-то интересно про float'ы и с чем их едят, то читаем IEEE 754, IEEE 854, RFC 1832...

Но там про 48 тоже молчок.

Это сообщение отредактировал(а) Mayk - 27.6.2005, 16:58


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Дрон
Дата 27.6.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Ну посмешили, ребята!!! smile smile smile smile smile smile smile

Цитата(Mayk @ 27.6.2005, 17:57)
sizeof(long double)=80

sizeof(long double) = 10

Цитата(B2_Russia @ 27.6.2005, 16:23)
юзайте double !

А разницы?
Точность-то всё равно ограничена.

gepard
Цитата(gepard @ 20.6.2005, 09:42)
abs(0.5 - (- 0.5)) <= 0.00001 - никак не пойдёт
fabs(-0.5 - 0.5) <= 0.00001 - Тоже не покатит.

Чем тебе это не нравится?

Это сообщение отредактировал(а) Дрон - 27.6.2005, 17:11


--------------------
Да. Именно так.
PM   Вверх
Mayk
Дата 27.6.2005, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Дрон
Тьфу. Имелись в виду биты smile


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
pablo
Дата 27.6.2005, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



Ошибся я чуток, точнее просто забыл, но это не главное. Я просто хотел предложить вам способ сравнение чисел с плавающей точкой и мне интерено ваше мнение.
Добавлено @ 00:04
Кстати при вычитании, не отбрасывается ли точность т.е если сравнивать такие два числа 0.5 и 0.50001 не покажутся ли они одинаковые ?


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
Mayk
Дата 28.6.2005, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

Репутация: 45
Всего: 134



Цитата(pablo @ 27.6.2005, 23:59)
0.5 и 0.50001 не покажутся ли они одинаковые ?

Так в том то и вся соль, чтоб они были одинаковыми.
Чтоб не показались одинаковыми надо использовать встроенный bool operator == (float, float).
Есть еще такой прикол что одно и то же число можно записать несколькими способами.
Например 0,1 = 1 * 10^(-1) = 10 * 10^(-2).
(разумеется во флотах комп оперирует 2оичной арифметикой)




Это сообщение отредактировал(а) Mayk - 28.6.2005, 09:22


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Adil'
Дата 28.6.2005, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 6
Всего: 15



Цитата(Mayk @ 28.6.2005, 09:19)
Есть еще такой прикол что одно и то же число можно записать несколькими способами.
Например 0,1 = 1 * 10^(-1) = 10 * 10^(-2).
(разумеется во флотах комп оперирует 2оичной арифметикой)

Комп всегда хранит плавающие числа в нормализованном виде - если, как в этом примере, в десятичном виде - то как 1 * 10^(-1)


--------------------
Удачи
PM MAIL WWW   Вверх
yaja
Дата 28.6.2005, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



возможно я неправ, но одно и тоже число(вещественное, типа float, double...) может иметь одно и тоже значение, но разно представление в памяти (разную последовательность бит), а встроенный bool operator == (float, float) сравнивает побитово...
поэтому если нужно сравнить два чила на равенство, то пишут fabs(x - y) < EPSILON
эту запись встречал во всех смотренных мною проектах (не просто маленьких программах, а в проектах smile ), никакого другого способа не встречал ине слышал smile
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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