Ну, в идеале, вы должны подождать, пока Intel исправит ошибку или предоставит обходной путь: -)
Но если вы хотите обнаружить значения NaN
и Inf
из значений IEEE754, сопоставьте их с целым числом (32 или 64 бита в зависимости от того, одинарная или двойная точность) и проверьте, равны ли все биты экспоненты 1. Это указывает на эти два случая.
Вы можете различить NaN
и Inf
, проверив старший бит мантиссы. Если это 1, это NaN
в противном случае Inf
.
+/-Inf
продиктовано знаковым битом.
Для одинарной точности (32-битные значения) знак является старшим битом (b31), экспонента - следующими восемью битами (плюс 23-битная мантисса). Для двойной точности знак по-прежнему является старшим битом, но показатель степени составляет одиннадцать бит (плюс 52 бита для мантиссы).
Википедия содержит все кровавые подробности.
Следующий код показывает, как работает кодировка.
#include <stdio.h>
static void decode (char *s, double x) {
long y = *(((long*)(&x))+1);
printf("%08x ",y);
if ((y & 0x7ff80000L) == 0x7ff80000L) {
printf ("NaN (%s)\n", s);
return;
}
if ((y & 0xfff10000L) == 0x7ff00000L) {
printf ("+Inf (%s)\n", s);
return;
}
if ((y & 0xfff10000L) == 0xfff00000L) {
printf ("-Inf (%s)\n", s);
return;
}
printf ("%e (%s)\n", x, s);
}
int main (int argc, char *argv[]) {
double dvar;
printf ("sizeof double = %d\n", sizeof(double));
printf ("sizeof long = %d\n", sizeof(long));
dvar = 1.79e308; dvar = dvar * 10000;
decode ("too big", dvar);
dvar = -1.79e308; dvar = dvar * 10000;
decode ("too big and negative", dvar);
dvar = -1.0; dvar = sqrt(dvar);
decode ("imaginary", dvar);
dvar = -1.79e308;
decode ("normal", dvar);
return 0;
}
и выводит:
sizeof double = 8
sizeof long = 4
7ff00000 +Inf (too big)
fff00000 -Inf (too big and negative)
fff80000 NaN (imaginary)
ffefdcf1 -1.790000e+308 (normal)
Просто имейте в виду, что этот код (но не метод) во многом зависит от размеров ваших длинных, которые не слишком переносимы. Но если вам нужно немного поиграть, чтобы получить информацию, вы уже въехали на эту территорию: -)
Кроме того, я всегда находил преобразователь Харальда Шмидта IEEE754 очень полезным для анализа с плавающей запятой.