wizzard: (Default)
[personal profile] wizzard
Что должна возвращать функция min(NaN, -Infinity), и почему?

UPD: уиии, я знаю уже 8 вариантов (не считая "implementation-defined" и "падаем с исключением")

1. NaN
"Если в вычислениях родился NaN, результат любых вычислений типа-неверен, заражаем результаты ошибкой дальше"

2. Оставшийся операнд
"Если NaN означает отсутствие результата, то min(пусто, что_то) = что_то"
(С99, IEEE754-2008)

3. Операнд №2
При свёртке (fold) трактуем NaN во втором аргументе как "неверно", а в первом как "пусто"
(x86 minss/minps/minsd/minpd)

4. Операнд №1 (то же самое как и вариант 3, но наоборот)
(нигде не встречается)

5. Если любой из операндов NaN, возвращать default NaN
"заражаем ошибкой, но константой, ибо так проще"
(ARM NEON - VMIN.F32)

6. Если один из операндов QNaN, возвращать операнд №2. Если один из операндов SNaN, возвращать его же, сконвертированного в QNaN
"QNaN - пусто, SNaN - неверно"
(IBM POWER, VSX)
Ремарк: При этом VMX/AltiVec работают по варианту 1 (возвращать SNaN), хотя intrinsics у них такие же. Т.е. это как если бы Интел решил в AVX переделать min из SSE

7. ни NaN, ни Inf не поддерживаются, результат - undefined (по ISA). На практике возвращается -FLT_MAX (внезапно!), но вообще может быть хоть битовый мусор
"для 3д графики всё равно надо в итоге что-то нарисовать, не кормите туда NaNы"
(AMD 3dnow!, также какие-то старые GPU)

8. min(NaN, -Infinity) = NaN, max(NaN, -Infinity) = -Infinity
"Для стабильной сортировки floating-point колонок в БД"

Вот, вроде всё. Источники: Marat Dukhan, vit_r, IEEE 754 :)

Profile

wizzard: (Default)
wizzard

January 2019

S M T W T F S
  12 345
6789101112
1314 1516171819
202122 23242526
2728293031  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Apr. 20th, 2019 06:18 am
Powered by Dreamwidth Studios