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

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

Страниц: 1 2 3 [4] 5   Вниз
  Печать  
Автор Тема: Старая шутка  (Прочитано 37316 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2094



Просмотр профиля
« Ответ #45 : Февраль 23, 2017, 19:17 »

Цитировать
Тогда все сразу становится очень натуральным. Ну это всего лишь "я так думаю"
Да, да,  с таким подходом можно оправдать любой говнокод)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #46 : Февраль 23, 2017, 19:17 »

Он явно рассчитывает на то что sqrt будет вычисляться асинхронно
Код
C++ (Qt)
float b = sqrt(a);  // сразу запускает вычисление
// если тут какой-то код,
// то он будет выполняться параллельно

float b = sqrt(a);
float c = b * sin(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 не волк, в лес не уйдёт
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #47 : Февраль 23, 2017, 21:56 »

а так распараллелится? Улыбающийся
Конечно. Главное в конце результат проверит на NaN, и если там он, то результат сделать равным 0 (или 100500, кому как нравится). Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #48 : Февраль 24, 2017, 12:15 »

Да, да,  с таким подходом можно оправдать любой говнокод)
Что все в говно ударились? Улыбающийся Говно- или нет - это уже совершенно др вопрос, это по существу насколько уместен тот или иной прием в конкретном коде. Но сам прием хорошо бы знать (а не глазками лупать Улыбающийся)

Update: ну вот напр не нравится извращенная (с точки зрения обычного восприятия) логика
Код
C++ (Qt)
(!(w >= 0))
И кричим - как будто все дело в этой записи. Но это легко убрать напр
Код
C++ (Qt)
if (!ValidW(w))
...
inline bool ValidW( float w ) { return w >= 0; }
И опять мы достигли того же (проверились на nan) уже без проблем с читабельностью.
« Последнее редактирование: Февраль 24, 2017, 12:26 от Igors » Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


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


Просмотр профиля
« Ответ #49 : Февраль 24, 2017, 13:25 »

На nan надо проверять через isNaN(w).
А код (!(w >= 0)) - говно в любом случае, независимо от ожиданий.
Причем что самое страшное здесь - это непортируемая временная бомба.
Возьмет умный компилятор и соптимирует это в if (w < 0) - почему нет? легитимно ведь.
А через время получим крэш и будем думать - WTF?
Записан

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


Просмотр профиля
« Ответ #50 : Февраль 25, 2017, 13:09 »

Возьмет умный компилятор и соптимирует это в if (w < 0) - почему нет? легитимно ведь.
Не легитимно (хотя это не тот вопрос что решается голосованием), и компилятор об этом прекрасно осведомлен  Улыбающийся

А код (!(w >= 0)) - говно в любом случае, независимо от ожиданий.
Думается такая реакция вызвана просто необычностью этой конструкции (хотя по выносу мозга ой далеко до оператора ()). Меня тоже сходу это смутило, но замешательство длилось неск секунд, потом догадался (сталкивался с подобным раньше). Возможно автор хотел таким образом (лаконично) подчеркнуть что проверяет (напр в читабельном варианте с ValidW это совсем не очевидно).

а так распараллелится? Улыбающийся
Цитировать
...
..и подошли они к ж/д рельсам. "Звяк" - сказала бензопила, и сломалась.
"Ааа, блин" - сказали суровые сибирские мужики
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #51 : Февраль 25, 2017, 16:20 »

Думается такая реакция вызвана просто необычностью этой конструкции
В конструкции нет ничего не обычного, реакция вызвана исключительно проверкой результата на NaN, вместо контроля входных параметров для тех функций, которые при неверном параметре возвращают тот самый NaN.
Вы же на ноль не делите? Проверяете?
« Последнее редактирование: Февраль 25, 2017, 16:27 от Old » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #52 : Февраль 25, 2017, 17:59 »

Кстати, кто сказал, что функции при неверных аргументах бросятся nan возвращать? Та же sqrt например.
Записан

Пока сам не сделаешь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #53 : Февраль 25, 2017, 18:44 »

Кстати, кто сказал, что функции при неверных аргументах бросятся nan возвращать? Та же sqrt например.
http://en.cppreference.com/w/cpp/numeric/math/sqrt
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #54 : Февраль 26, 2017, 12:35 »


Там и не написано, что sqrt обязана NaN возвращать: "If a domain error occurs, an implementation-defined value is returned (NaN where supported)". И для выявления ошибки нужно не возвращаемое значение анализировать, а проверять math_errhandling.

Не знаю, насколько компилятор в mingw 5.4.0 "supports IEEE floating-point arithmetic (IEC 60559)", но NAN там есть. При этом у меня sqrt от отрицательного числа возвращает это входное число, а не NAN.
Записан

Пока сам не сделаешь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #55 : Февраль 26, 2017, 12:38 »

Чуть ниже раздел Error handling, там есть:
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
    If the argument is less than -0, FE_INVALID is raised and NaN is returned.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #56 : Февраль 26, 2017, 12:54 »

Чуть ниже раздел Error handling, там есть:
If the implementation supports IEEE floating-point arithmetic (IEC 60559),
    If the argument is less than -0, FE_INVALID is raised and NaN is returned.

Тем не менее:
Не знаю, насколько компилятор в mingw 5.4.0 "supports IEEE floating-point arithmetic (IEC 60559)", но NAN там есть. При этом у меня sqrt от отрицательного числа возвращает это входное число, а не NAN.

Это баг или фича? Улыбающийся

В любом случае это не отменяет факта, что для определения ошибки нужно не возвращаемое значение проверять, а math_errhandling (что в примере к sqrt и сделано). Что нудно, не интересно и не так лаконично, как "!(w>=0)" Веселый. Ну или аргументы проверять и валидные входные данные подавать. Но это совсем не круто и не асинхронно.
Записан

Пока сам не сделаешь...
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #57 : Февраль 26, 2017, 13:09 »

Код
C++ (Qt)
if (w != pow(sqrt(w), 2)){
   ....
}
 
Бам!!!  Крутой Крутой Крутой
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #58 : Февраль 26, 2017, 14:43 »

В любом случае это не отменяет факта, что для определения ошибки нужно не возвращаемое значение проверять, а math_errhandling (что в примере к sqrt и сделано). Что нудно, не интересно и не так лаконично, как "!(w>=0)" Веселый.
Ах как Вы взыскательны Улыбающийся Однако практически бесконечные проверки Вас быстро вымотают и засорят код. Тогда броситесь в др крайность - ничего не проверять. И.т.д. В общем вариант с проверкой nan отнюдь не плох.
Ну или аргументы проверять и валидные входные данные подавать. Но это совсем не круто и не асинхронно.
Не только. Всегда есть сторонний код. Напр инверсия матриц - Вы можете поручиться что Гаусс не обкакается? Тогда извольте проверить входную матрицу - а как?

Код
C++ (Qt)
if (w != pow(sqrt(w), 2)){
   ....
}
 
Бам!!!  Крутой Крутой Крутой
Так оно и будет не равно для некруглых. И от перестановки слагаемых суммв меняется
Код
C++ (Qt)
(a + b) + c != a + (b + c);
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #59 : Февраль 26, 2017, 14:52 »

Не только. Всегда есть сторонний код. Напр инверсия матриц - Вы можете поручиться что Гаусс не обкакается?
А что будете делать, если сторонний код будет делить на ноль? Улыбающийся

В общем вариант с проверкой nan отнюдь не плох.
Это если бы он работал. А так, как ViTech выше показал, даже корень из отрицательного числа не всегда возвращает NaN. Улыбающийся
« Последнее редактирование: Февраль 26, 2017, 14:55 от Old » Записан
Страниц: 1 2 3 [4] 5   Вверх
  Печать  
 
Перейти в:  


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