Шутка для узких кругов
Dec. 13th, 2014 02:11 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Что должна возвращать функция 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 :)
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 :)