Не число (NaN)

Почему некоторые числа определены как не число (NaN) в арифметике с плавающей запятой? (Хотя они могут быть представлены в формате IEEE и действительно являются действительными числами)

2 ответа

Автор вопроса также разместил этот комментарий:

Я не понимаю, как числа, для которых "все показательные биты равны 1, а мантисса - это не все нули", не являются действительными числами.

Причина этого комментария выглядит следующим образом: двоичный формат с плавающей запятой имеет знаковый бит s, некоторые показательные биты e и некоторые значащие и биты f. Для большинства значений e представленное значение равно (−1) s • 1. f • 2 e - смещение (где "1. f " - двоичное число, образованное объединением "1.", а биты f и смещение - это смещение кодирования для показателя степени). При этой схеме значение показателя степени всех будет числом, так как же это NaN?

Ответ заключается в том, что стандарт IEEE-754 определяет, что представляют собой биты кодирования с плавающей запятой, и утверждает, что:

  • Если e равно нулю, представленное значение равно (−1) s • 0. f • 2 e min, где e min - минимальный показатель степени для формата. (e min равняется 1- смещению.)
  • Если e не все ноль или все единицы, представленное значение равно (−1) s • 1. f • 2 e - смещение.
  • Если e - все единицы, а f - ноль, представленное значение равно (−1) s • ∞.
  • Если e все единицы и f не ноль, представленное значение является NaN. (Существуют некоторые зависящие от реализации подробности о сигнализации NaN против тихих NaN и использовании битов f для передачи дополнительной информации.)

Тот факт, что существует шаблон значений, представленных для значений e между (но не включая) всеми нулями и всеми единицами, не означает, что шаблон должен быть расширен до тех пор, пока e - все нули или все единицы. Ничто в логике или физике не заставляет нас проектировать аппаратные средства, которые распространяют шаблон на все значения e. Правила были сделаны, как описано выше, и реализации IEEE-754 с плавающей точкой следуют этим правилам.

Кроме того, значения, описанные выше, образуют набор, который IEEE-754 вызывает для данных с плавающей запятой. Этот набор включает в себя −∞ и +∞, различные ненулевые действительные числа, возникающие из значений s, e и f, двух "нулей", отличающихся знаком: −0 и +0, и NaN. Большая часть спецификации арифметических операций IEEE-754 использует эти значения. Например, сложение определяется для получения результата, как если бы была рассчитана точная математическая сумма, а затем к ней было применено правило округления. Каждое правило округления указывает, что, если значение выходит за определенные границы, результатом является бесконечность. В противном случае точная математическая сумма округляется до ближайшего представимого значения в направлении, заданном правилом округления (например, ближайшем в любом направлении, в направлении +∞, в направлении −∞ или в направлении нуля).

Таким образом, когда реализован IEEE-754 в аппаратном или программном обеспечении, реализация разработана в соответствии с этими правилами. Когда правила говорят, что бесконечность должна быть произведена, реализация создает битовый шаблон, который представляет бесконечность. Когда входной операнд имеет битовый шаблон для бесконечности, реализация обрабатывает его как бесконечность, а не как действительное число, которое оно представило бы, если бы кодировка экспоненты имела значение, которое расширяло шаблон нормальных чисел.

Особые случаи Inf и NaN не рассматриваются как числа, потому что они по определению являются Inf и NaN. Это определение содержится в разделе 6.2.1 IEEE 754-2008 (не является свободным стандартом).

Создание и распространение NaN осуществляется аппаратно (по крайней мере, на оборудовании Intel, см., Например, "Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32", в частности, E4.2.2, в котором это подробно описано).

Другие вопросы по тегам