Russian Qt Forum
Май 25, 2024, 03:08 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: сравнение вещественных типов  (Прочитано 5905 раз)
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« : Июль 12, 2013, 10:03 »

Знаю, что для сравнения вещественных чисел нужно использовать величину погрешности - зависящую от математических операций.
Корректно ли сравнивать float, double, QRectF... если над ними не проводились математические операции?

например такой код:
Код:
const float k = 180.;

if( zzz() ) a = k;
else a = calc();
...
if(a=k) test();

Например рисую пирог, и задаю начальный градус и конечный, если от -180.0 до 180.0 значит рисую другой функцией круг.
« Последнее редактирование: Июль 12, 2013, 10:08 от deMax » Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Июль 12, 2013, 10:07 »

Корректно ли сравнивать float, double, QRectF... если над ними не проводились математические операции?
Скажем так, в этом случае сравнение покажет правильный результат. Но делать так опасно, никогда не знаешь, что нужно будет изменить в проекте, случайно добавите калькуляцию и все может тихо перестать работать.
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #2 : Июль 12, 2013, 10:19 »

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

p.s. я решил так сделать потому что не хотел вводить дополнительную переменную флаг, о том что переменная равна (-180. , 180.)
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Июль 12, 2013, 10:25 »

p.s. я решил так сделать потому что не хотел вводить дополнительную переменную флаг, о том что переменная равна (-180. , 180.)
А почему так не хотите?
Знаю, что для сравнения вещественных чисел нужно использовать величину погрешности
Записан
mutineer
Гость
« Ответ #4 : Июль 12, 2013, 10:28 »

Код:
else a = calc();
Вот в этом случае test() может вызваться, а может и нет
Записан
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« Ответ #5 : Июль 12, 2013, 11:35 »

Если значение нужно сравнивать с другим, можно его хранить в int, например в случае с 1 знаком после запятой: 180.1 * 10 = 1801 - это значение сохраняем в переменную int и сравниваем без проблем. Когда нужно нарисовать что-то, переводим в float: (float)angle / 10.0
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4732



Просмотр профиля WWW
« Ответ #6 : Июль 12, 2013, 11:47 »

есть функция bool qFuzzyCompare ( double p1, double p2 ) для этой цели
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #7 : Июль 12, 2013, 14:01 »

p.s. я решил так сделать потому что не хотел вводить дополнительную переменную флаг, о том что переменная равна (-180. , 180.)
А почему так не хотите?
Не люблю плодить сущности, тем более в ней нет смысла. float это не вода в стакане(испариться/дождик накапает), а конкретные биты [ знак, экспонента, мантиса ] , если не проводить никаких операций, то что с ними будет?
есть функция bool qFuzzyCompare ( double p1, double p2 ) для этой цели
А побитно не проще сравнить?

Код:
else a = calc();
Вот в этом случае test() может вызваться, а может и нет
главное что он точно вызовется если zzz() вернет true, и он точно вызовется если в calc() будет выполнена команда return k;


p.s. и далеко не вся математика убивает комплексные числа,  float a(2),b(3),c(5); qDebug()<<(a+b==c); вернет true. главное чтоб округления не было.
« Последнее редактирование: Июль 12, 2013, 14:07 от deMax » Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #8 : Июль 12, 2013, 14:19 »

если не проводить никаких операций, то что с ними будет?
Я уже написал - ничего. Главное не забыть об этом в дальнейшем... Подмигивающий
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #9 : Июль 12, 2013, 14:28 »

если не проводить никаких операций, то что с ними будет?
Я уже написал - ничего. Главное не забыть об этом в дальнейшем... Подмигивающий
Спасибо. Так и буду делать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Июль 12, 2013, 14:50 »

Код:
if(a=k) test();
Наверное Вы хотели написать a == k

Не люблю плодить сущности, тем более в ней нет смысла. float это не вода в стакане(испариться/дождик накапает), а ..
Может не стоит "так бодро"? Улыбающийся Есть много вещей с флотами не так уж очевидных. Пример
Код
C++ (Qt)
float k = sqrt(b);
if (b >= 0) a = k;
else a = 180.0f;
 
Код
C++ (Qt)
if (b >= 0) a = sqrt(b);
else a = 180.0f;
 
Очевидно второй оптимальнее, но тождественны ли эти 2 варианта?

Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #11 : Июль 15, 2013, 11:41 »

Очевидно второй оптимальнее, но тождественны ли эти 2 варианта?
В первом случае корень будет извлекаться всегда, во втором только при выполнении условия. Результат работы программы будет одинаков.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Июль 15, 2013, 13:57 »

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

Результат работы программы будет одинаков.
Результат вычисления "a" будет одинаков. А вот "работы прогоаммы" может и нет
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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