Что означает ошибка с плавающей запятой -1. # J?

В последнее время (редко), когда мы экспортируем данные из нашего приложения, журнал экспорта содержит значения с плавающей точкой, которые выглядят как "-1. # J". Я не смог воспроизвести его, поэтому не знаю, как выглядит float в двоичном формате или как Visual Studio отображает его.

Я попытался посмотреть исходный код для printf, но ничего не нашел (не на 100% уверен, что посмотрел на правильную версию, хотя...).

Я пробовал googling, но google выбрасывает любые #, кажется. И я не могу найти списки ошибок float.

Ответ 1

Это может быть либо отрицательная бесконечность, либо NaN (а не число). Из-за форматирования на поле printf не различает их.

Я попробовал следующий код в Visual Studio 2008:

double a = 0.0;
printf("%.3g\n", 1.0 / a);  // +inf
printf("%.3g\n", -1.0 / a); // -inf
printf("%.3g\n", a / a);    //  NaN

что приводит к следующему результату:

1.#J
-1.#J
-1.#J

удаление спецификатора форматирования .3 дает:

1.#INF
-1.#INF
-1.#IND

поэтому ясно, что 0/0 дает NaN и -1/0 дает отрицательную бесконечность (NaN, -inf и + inf являются единственными "ошибочными" числами с плавающей запятой, если я правильно помню)