Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0644 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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