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

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: "Не-темплейтность" Qt  (Прочитано 26298 раз)
Bepec
Гость
« Ответ #30 : Март 16, 2015, 12:19 »

Нет такой болезни, есть неприятный опыт работы с шаблонами Улыбающийся
Записан
RSATom
Гость
« Ответ #31 : Март 16, 2015, 12:24 »

http://rsdn.ru/forum/cpp/5638123.1
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #32 : Март 16, 2015, 12:32 »

Нет, все гораздо тривиальней. Если я вам скажи что эти 2 числа это координаты пикселя на экране? В этом мы смело можем утверждать что эти числа должны трактоваться как эквиалентные.
Следующий вопрос: а эквивалентны ли  1.9 и 1.8?
Ответ: Иногда да, а иногда нет.
Да - если мы все еще оперируем координатами пикселя на экране.
Нет - если мы оперируем координатами пикселя на экране но например для SVG анимации.

Это я все к тому, что в случае с числами с плавающей точкой, размер допуска при сравнении может быть разный в зависимости от конкретного применения.
С этим никто не спорит. Не так давно у меня был случай: QCursor::pos() выдает другое значение чем event->pos(). Оказывается OSX выдает позицию мыши во флотах, и проблемы с округлением. Но ведь наличие 2 классов (QPoint и QPointF) никак не спасло меня. Др словами эти проблемы так или иначе надо решать, не видно как это связано с "template или нет"
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #33 : Март 16, 2015, 13:12 »

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

И кстати про ПЛИС у меня в резюме ни слова, странное что вы меня вообще на собеседование позвали...
Так ведь у Вас в резюме стоит "Знание С++ - на уровне способности проводить собеседования кандидатов" и нигде не написано, что для Вас "С++" это только x86. Извините, что заняли Ваше время, просим далее быть более конкретным в оценке своих навыков.

Нет, все гораздо тривиальней. Если я вам скажи что эти 2 числа это координаты пикселя на экране? В этом мы смело можем утверждать что эти числа должны трактоваться как эквиалентные.
Всё гораздо сложнее.  В координатной сетке векторного Framework, который мы используем для рисования, логические координаты точек для обеспечения независимости от разрешения экрана меняются в диапазоне 1..2, и в этом случае при выводе изображения на экран
SuperMegaFullHD это, безусловно, разные числа, и Ваше смелое предположение насчет их эквивалентности является неверным.

Это я всё к тому, что стоить посмотреть как трансформировался Ваш "тривиальный" вопрос, предполагавший не менее "тривиальный" ответ.
« Последнее редактирование: Март 16, 2015, 13:14 от xokc » Записан
RSATom
Гость
« Ответ #34 : Март 16, 2015, 13:42 »

Ну так об этом и речь: "Ответ: Иногда да, а иногда нет."
Записан
RSATom
Гость
« Ответ #35 : Март 16, 2015, 13:47 »

Подозреваю, что и тут не очень удалось свою мысль выразить. По крайней мере я вопроса не понял.

Ок, переформулирую: Как осуществляется сравнение на равенство целочисленных типов на платформах без поддержки целочисленных вычислений?
« Последнее редактирование: Март 16, 2015, 14:10 от RSATom » Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #36 : Март 16, 2015, 14:27 »

Ок, переформулирую: Как осуществляется сравнение на равенство целочисленных типов на платформах без поддержки целочисленных вычислений?
Как я и говорил ранее - целочисленные типы рассматриваются как частный случай float. То есть там int - это float, с дробной частью, равной нулю. Поэтому правильный ответ - в зависимости от реализации этого сравнения компилятором и даже от параметров компилятора. Условно говоря, для -O1 - это может быть одна реализация сравнения, а для -O3 - вообще совершенно другая. И говорить про "поведение по-умолчанию" даже для примитивных типов можно только для совершенно конкретной комбинации компилятора и платформы.
Записан
RSATom
Гость
« Ответ #37 : Март 16, 2015, 14:35 »

Это только довод в пользу того что этому вопросу необходимо уделять специальное внимание. Соответственно изначальный тезис о том что "надо просто использовать template и будет счастье" все же не верен. Что и требовалось доказать.
Записан
RSATom
Гость
« Ответ #38 : Март 16, 2015, 14:37 »

Кстати, а как решается вопрос что не всякое целое число можно представить в виде числа с плавающей точкой?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Март 16, 2015, 16:03 »

Ладно, оффтоп так оффтоп, все равно "говорилка". Давайте и я про флоты,
Код
C++ (Qt)
float a, b;
...
a = (b < 0) ? 0 : sqrt(b);
 
Код
C++ (Qt)
float a, b;
...
a = sqrt(b);
if (b < 0) a = 0;
 
Есть ли здесь какая-то разница или дело только в оптимальности?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #40 : Март 16, 2015, 16:38 »

Это только довод в пользу того что этому вопросу необходимо уделять специальное внимание. Соответственно изначальный тезис о том что "надо просто использовать template и будет счастье" все же не верен. Что и требовалось доказать.
Нэкоррэктно, такого тезиса я не выдвигал Улыбающийся Возьмем напр "int" и "long long", Вы знаете, они ведь тоже не равны и могут иметь разное поведение. Выходит им тоже "необходимо уделять специальное внимание", и тоже темплейт нехорош. Может лучше прямо сказать "та ну его нафиг, тот темплейт", как (по существу) делает Верес  Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #41 : Июль 29, 2015, 17:20 »

По поводу оператора == для флоатов и даблов, имхо, проблема чисто языковая. Стандарт С++ просто ничего не говорит об особенностях его применения для данных типов, и как следствие, оператор становится неипользуемым. Все пишут свои велосипеды fuzzy сравнивания. Как по мне, было бы идеально ввести в сам язык понятие fuzzy сравнения для вещественных типов по умолчанию. Т.е. по умолчанию компилятор будет генерировать нужный код сам, встретив что-то типа "if (a == 0.05)..", с точностью сравнения, определенную стандартом языка (например, std::numeric_limits::epsilon). Если кому недостаточно - тогда пожалуйста, make a bike Улыбающийся
Записан

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 не волк, в лес не уйдёт
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Я провожу сравнения с помощью ==, без фузи.
Но не просто так. После считывания текстового файла.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #43 : Июль 30, 2015, 08:01 »

По поводу оператора == для флоатов и даблов, имхо, проблема чисто языковая. Стандарт С++ просто ничего не говорит об особенностях его применения для данных типов, и как следствие, оператор становится неипользуемым. Все пишут свои велосипеды fuzzy сравнивания. Как по мне, было бы идеально ввести в сам язык понятие fuzzy сравнения для вещественных типов по умолчанию. Т.е. по умолчанию компилятор будет генерировать нужный код сам, встретив что-то типа "if (a == 0.05)..", с точностью сравнения, определенную стандартом языка (например, std::numeric_limits::epsilon). Если кому недостаточно - тогда пожалуйста, make a bike Улыбающийся
Тут и компилятор не нужен, это поддерживается самим форматом флотов. Напр
Код
C++ (Qt)
float test1 = 21234567.8901f;
float test2 = nexttowardf(test1, test1 * 2);
printf("%f\n", test2 - test1);
 
printf("(test1 == test1 + 1) = %d\n", int(test1 == test1 + 1));
 
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #44 : Июль 30, 2015, 16:25 »

Не, я имел в виду "нативное" сравнение флотов как средство языка. Чтобы запись не отличалась от математической:

float a, b;
...
if (a == b)...

с точно таким же математически определенным поведением, как и для int. Без эксплицитного использования фузи и доп. функций.
Записан

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.174 секунд. Запросов: 23.