Безответные NaN - это те, которые имеют в самом значащем разряде своей мантиссы единицу. Процессор i486 выдает вещественную неопределенность (определяемую ниже) - один из видов QNaN - как ответ по умолчанию на конкретные условия возникновения исключения. Процессор i486 может также получать другие виды QNaN преобразованием SNaN. Процессор i486 переводит SNaN в QNaN, устанавливая в самом значащем разряде мантиссы единицу. Остальные биты мантиссы остаются неизменными, поэтому диагностическая информация, которая могла храниться в этих битах SNaN переходит в QNaN. Процессор i486 будет также генерировать особое QNaN, вещественную неопределенность, как маскированный ответ на исключение недопустимой операции. Это NaN имеет отрицательный знак, его мантисса кодируется как 1100..00. Все другие NaN представляют из себя значения, созданные программистом или полученные из значений, созданных программистом.
Как сигнальные, так и безответные NaN поддерживаются во всех операциях. QNaN генерируется как маскированный ответ на исключение недопустимой операции или как результат операции, в которой хотя бы один операнд является QNaN. При генерации QNaN процессор i486 придерживается правил, показанных в Таблице 16-5.
Таблица 16-5. Правила Генерирования QNaN +---------------------------------------------------------------+| Операция | Действие |+-------------------------------+-------------------------------|| | || Вещественная над SNaN и QNaN. | Передает операнд типа QNaN. || | || Вещественная над двумя SNaN. | Передает QNaN, получаемое || | переводом SNaN, которое имеет || | большую мантиссу. || | || Вещественная над двумя QNaN. | Передает QNaN, которое имеет || | большую мантиссу. || | || Вещественная над SNaN и | Передает QNaN, получаемое || другим числом. | переводом SNaN. || | || Вещественная над QNaN и | Передает QNaN. || другим числом. | || | || Недопустимая, не включающая | Передает вещественную || типа NaN. | неопределенность типа QNaN. || | |+---------------------------------------------------------------+
Обратите внимание, что обработка операнда QNaN имеет больший приоритет, чем все исключительные ситуации, за исключением конкретных исключительных ситуаций, связанных с недопустимыми операциями (смотрите раздел "Приоритетность исключительных ситуаций" в этой главе).
Безответные NaN можно было бы использовать, например, для того, чтобы ускорить отладку. В начальной фазе тестирования программа часто содержит многочисленные ошибки. Млжно было бы написать обработчик исключений для того, чтобы сохранять диагностическую информацию в памяти всегда, когда вызывается этот обработчик. После сохранения диагностической информации он мог бы выдавать QNaN как результат ошибочной команды, а это QNaN могло бы указывать на область памяти, где собраны диагностики. Затем программа могла бы продолжиться, создавая различные NaN для каждой ошибки. После завершения программы результирующие NaN могли бы быть использованы для доступа к диагностическим данным, сохраненным в момент прохождения ошибки. Таким образом можно было бы диагностировать и исправлять сразу много ошибок за один проход тестирования.
В тех приложениях, которые используют полученные результаты в дальнейших вычислениях, необнаруженное QNaN может загубить все последующие результаты. Такие приложения следует периодически проверять на QNaN и предоставлять механизм восстановления, если был обнаружет QNaN результат.