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

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

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: "Не-темплейтность" Qt  (Прочитано 24474 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #45 : Июль 31, 2015, 07:39 »

с точно таким же математически определенным поведением, как и для int.
Это недостижимо из-за самого формата флотов (ну или "их природы"). Еще раз тот же пример
Код
C++ (Qt)
float a, b;
...
b = a + 1;
if (a == b)  // для флотов может вернуть true
Др словами если мы хотим хранить гигантское число - мы должны смириться с потерей точности, это нормально
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #46 : Июль 31, 2015, 11:07 »

Формат флотов это понятно, но я не имею в виду "побитное" сравнение - иначе сравнение инта с флотом тоже никогда бы не работало, хотя и инт, и флот по умолчанию оба занимают по 4 байта. Для сравнения инта и флота компилятор генерирует код, который гарантирует приведение флота к инту непосредственно перед выполнением операции сравнения. Собственно, то же самое можно делать при сравнении двух флотов - сгенерировать базовый фузи-код. Естественно, с потерей точности.
« Последнее редактирование: Июль 31, 2015, 11:17 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #47 : Июль 31, 2015, 11:53 »

Для сравнения инта и флота компилятор генерирует код, который гарантирует приведение флота к инту непосредственно перед выполнением операции сравнения.
Наоборот, инт приводится к флоту  Улыбающийся

Собственно, то же самое можно делать при сравнении двух флотов - сгенерировать базовый фузи-код. Естественно, с потерей точности.
Фузи-фузи, а что в нем собственно такого хорошего? Для больших чисел он вообще бесполезен а для малых проблематичен.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #48 : Август 03, 2015, 15:41 »

Например, a = 0.123456789000001, а b = 0.123456789000002. Ну или около того. В текущей имплементации оператор if (a == b) вернет false, в принципе с одной стороны они и правда не равны, с другой - отличаются достаточно незначительно. Поэтому и пишет народ фузи типа if (qAbs(a-b) < MyLittleEpsilon). То есть оператор == вообще не используется должным образом, и как по мне, это недостаток. Компилятор должен сам уметь генерировать подобный фузи-код для сравнения флотов, встретив if (a == b).
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #49 : Август 03, 2015, 17:06 »

Например, a = 0.123456789000001, а b = 0.123456789000002. Ну или около того. В текущей имплементации оператор if (a == b) вернет false, в принципе с одной стороны они и правда не равны, с другой - отличаются достаточно незначительно. Поэтому и пишет народ фузи типа if (qAbs(a-b) < MyLittleEpsilon). То есть оператор == вообще не используется должным образом, и как по мне, это недостаток. Компилятор должен сам уметь генерировать подобный фузи-код для сравнения флотов, встретив if (a == b).
Я понимаю что Вы хотите, но думаю что здесь нет удачной возможности "единого решения". Что есть "достаточно незначительно" определяется задачей. Напр Qt реализация вполне хороша/грамотна, но
Код
C++ (Qt)
float a = 100.0f;
float b = 100.005f;
Qt fuzzy скажет что равны - но есть масса примеров где это не устроит. А раз так - нечего рыпаться на "общность" - это конкретно (и нолрмально)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #50 : Август 06, 2015, 12:34 »

В STL существует стандартное значение std::numeric_limits::epsilon. Его было бы достаточно. Если кого не устраивает - пишем свой фузи Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


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