Что означает ошибка с плавающей запятой -1. # J?
-
20-08-2019 - |
Вопрос
В последнее время, иногда (редко), когда мы экспортируем данные из нашего приложения, журнал экспорта содержит значения с плавающей точкой, которые выглядят как " -1. # J " ;. Я не смог воспроизвести его, поэтому я не знаю, как выглядит поплавок в двоичном формате или как Visual Studio отображает его.
Я попытался просмотреть исходный код для printf, но ничего не нашел (хотя не уверен на 100%, что посмотрел правильную версию ...).
Я пробовал поискать в Google, но, похоже, Google выбрасывает любые #. И я не могу найти списки ошибок с плавающей точкой.
Решение
Это может быть либо отрицательная бесконечность, либо 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 - единственное &; ошибочное &; числа с плавающей запятой, если я правильно помню) р>