Что означает ошибка с плавающей запятой -1. # J? - PullRequest
11 голосов
/ 08 мая 2009

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

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

Я пробовал поискать в Google, но, похоже, Google выбрасывает любые #. И я не могу найти списки ошибок с плавающей точкой.

1 Ответ

28 голосов
/ 08 мая 2009

Это может быть либо отрицательная бесконечность, либо 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 - единственные «ошибочные» числа с плавающей точкой, если я правильно помню)

...