Наткнулся на тему и решил дополнить.
Интересно. Я думал, просто неудобно было использовать часть значений NaN для чего-то другого
Я уже не помню где это впервые прочитал, про использование NaN для нужд отладки, но как аргумент к своим словам приведу что NaN-ы разделяются на два класса SNaN и QNaN, зачем нужны первые я не очень понимаю (разве только тестировать реакцию программы на NaN на входе или вылетать при чтении неинициализированных плавающих переменных, причём компилятор может даже закодировать в самом NaN где и каких), но для обоих типов прописано специальное правило, что если их встречается два одного типа в операции, то на выход выдаётся не абы какое, а обязательно с большим значением мантиссы. И это повелось аж с самого первого x87, правда на нём и заглохло, в SSE не попало и потому вряд ли используется современными компиляторами. Т.е.,
Geen, добавление функционала (различия SNaN и QNaN и сравнения мантисс) никак нельзя назвать "забыли/упростили и потому мы можем использовать для себя", это наоборот специально задумали и сделали (но видимо мало кому пригодилось). Сейчас эту инфу можно найти в
Table 4-7. Rules for Handling NaNs раздела
4.8.3.5 Operating on SNaNs and QNaNs документа Intel
64-ia-32-architectures-software-developer-manual (20мег). Приведу выдержку из следующего пункта оттуда же о примерах использования:
Цитата:
For example, a compiler can use signaling NaNs as references to uninitialized (real) array elements. The compiler can preinitialize each array element with a signaling NaN whose significand contained the index (relative position) of the element. Then, if an application program attempts to access an element that it had not initialized, it can use the NaN placed there by the compiler. If the invalid operation exception is unmasked, an interrupt will occur, and the exception handler will be invoked. The exception handler can determine which element has been accessed, since the operand address field of the exception pointer will point to the NaN, and the NaN will contain the index number of the array element.
Quiet NaNs are often used to speed up debugging. In its early testing phase, a program often contains multiple errors. An exception handler can be written to save diagnostic information in memory whenever it was invoked. After storing the diagnostic data, it can supply a quiet NaN as the result of the erroneous instruction, and that NaN can point to its associated diagnostic area in memory. The program will then continue, creating a different NaN for each error. When the program ends, the NaN results can be used to access the diagnostic data saved at the time the errors occurred. Many errors can thus be diagnosed and corrected in one test run.
In embedded applications that use computed results in further computations, an undetected QNaN can invalidate all subsequent results. Such applications should therefore periodically check for QNaNs and provide a recovery mechanism to be used if a QNaN result is detected.