Как известно, не-x86-ое железо - это миф, придуманный эпплом, чтобы продавать больше маков. )))
Но вдруг у вас сейчас под рукой имеется это самое мифическое не-x86-ое железо с Си-компилятором на нём?
Тогда посчитайте, пожалуйста, что получится, если "скастовать" NaN к целому типу?
#include <stdio.h>
int main()
{
double x = 0.0/0.0; // NaN
printf("%lx\n",(long)x);
return 0;
}
На x86-железе конвертация происходит через x87 FPU (в полном соответствии с Intel-овской спецификацией) и получается MIN_INTEGER (пишет на экране 8000000000000000)
А что происходит на другом железе? Какие значения там могут получиться?
Обратите внимание, что если выражение (long)NaN будет вычисляться в момент компиляции, то ответ может быть численно другой (напр., gcc в таких случаях ставит 0)!
Интересует значение, которое получается именно в рантайме на разном железе.
Возможно, придётся поставить volatile или как-то по-другому отключить оптимизацию.
Также стоит на всякий случай обратить внимание, что (long)NaN это совсем не то же самое что *(long*)(&NaN) - получаются разные численные результаты.
В первом случае действует некоторая нетривиальная логика, не фиксированная стандартом языка Си,
а во втором случае получаем вполне ожидаемое битовое представление плавучки согласно IEEE 754.
Что у вас есть под рукой? Мак, роутер, андроид? Попробуйте.
(int)NaN
programming
| вторник, 09 июня 2015