От: Gnu
IEEE 754 числа с плавающей точкой могут представлять положительную или отрицательную бесконечность, и NaN (не число). Эти три значения возникают из расчетов, результат которых не определен или не может быть представлен точно. Вы также можете преднамеренно установить переменную с плавающей запятой любому из них, что иногда полезно.Некоторые примеры расчетов, которые производят бесконечность или NaN:
1/0 = ∞
log (0) = -∞
sqrt (-1) = NaN
Когда расчет производит любое из этих значений, возникает исключение; см. Исключения FP.
Основные операции и математические функции принимают бесконечность и NaN и обеспечивают разумный выход. Бесконечность распространяется по расчетам, как и следовало ожидать: например, 2 + ∞ = ∞, 4/∞ = 0, atan (∞) = π/2. NaN, с другой стороны, заражает любые вычисления, которые его включают. Если расчет не привел бы к такому же результату, независимо от того, какая реальная стоимость заменила NaN, результатом будет NaN.
В сравнительных операциях положительная бесконечность больше всех значений, кроме самого себя и NaN, а отрицательная бесконечность меньше всех значений, кроме самого себя и NaN. NaN неупорядочен: он не равен, больше или меньше чем что-либо, включая себя. x == x является ложным, если значение x равно NaN. Вы можете использовать это, чтобы проверить, является ли значение NaN или нет, но рекомендуемый способ тестирования для NaN - с функцией isnan (см. Классы с плавающей точкой). Кроме того, <,>, < =, и> = вызовет исключение при применении к NaN.
math.h определяет макросы, которые позволяют явно установить переменную в бесконечность или NaN.
Macro: float INFINITY Выражение, представляющее положительную бесконечность. Он равен значению, создаваемому математическими операциями типа 1.0/0.0. -INFINITY представляет собой отрицательную бесконечность.
Вы можете проверить, является ли значение с плавающей запятой бесконечным, сравнивая его с этим макросом. Однако это не рекомендуется; вместо этого вы должны использовать isfinite macro. См. Классы с плавающей точкой.
Этот макрос был представлен в стандарте ISO C99.
Macro: float NAN Выражение, представляющее значение, которое не является числом. Этот макрос является расширением GNU, доступным только на машинах, которые поддерживают значение «не числа», то есть на всех машинах, поддерживающих плавающую точку IEEE.
Вы можете использовать '#ifdef NAN', чтобы проверить, поддерживает ли машина NaN. (Разумеется, вы должны устраивать расширения GNU, например, путем определения _GNU_SOURCE, а затем вы должны включить math.h.)
IEEE 754 также допускает другое необычное значение: отрицательный ноль. Это значение получается, когда вы делите положительное число на отрицательную бесконечность или когда отрицательный результат меньше пределов представления.
«это должно получиться как NaN» --- на чем основана это утверждение? Поведение C# довольно похоже на математику. – zerkms
Проверьте этот ответ (другой вопрос): http: // stackoverflow.com/a/14244726/2359643 или этот http://stackoverflow.com/a/15117594/2359643 – JNYRanger
C# просто следует спецификациям IEEE. – Servy