NaN Literal в C?

Как вы пишете литерал с плавающей запятой NaN в C?

Ответы

Ответ 1

В C99 <math.h>

  7.12  Mathematics <math.h>
   [#5] The macro

           NAN

   is defined if and only if the implementation supports  quiet
   NaNs   for  the  float  type.   It  expands  to  a  constant
   expression of type float representing a quiet NaN.           |

Ответ 2

5.2.4.2.2/3:

типы флагов могут содержать другие виды номеров флагов, таких как... судьбы и NaNs. NaN - кодирование обозначая Not-a-Number. Тихий NaN распространяется почти каждая арифметическая операция без повышение исключения исключающей точки; сигнализация NaN обычно повышает исключение с точки зрения исключения при возникновении как арифметический операнд.

7.12/5 (math.h):

Макрос NAN определяется тогда и только тогда, когда реализация поддерживает спокойные NaNs для типа float. Он расширяется до постоянное выражение типа float представляя собой спокойный NaN.

Таким образом, вы можете получить значение, если ваша реализация поддерживает NaN вообще, и если некоторые или все эти NaN являются тихими. Если вы не находитесь на территории, определенной реализацией.

Также есть некоторые проблемы с некоторыми из этих макросов с плавающей запятой, которые компилятор может не знать, поддерживает ли он эту функцию или нет, потому что она создает код, который может работать на нескольких версиях архитектуры, где поддерживается поддержка. Я не знаю, относится ли это к этому макросу, но это еще одна ситуация, когда вы находитесь на территории, определяемой реализацией, - препроцессор может консервативно утверждать, что он не поддерживает эту функцию, когда на самом деле реализация в целом, re используя его, делает.

Ответ 3

Использование NAN лучше, но если вы находитесь в системе с NaN, 0.0/0.0 - это простой способ получить один...

Ответ 4

В C вы можете написать литерал с плавающей запятой NaN следующим образом.

const unsigned long dNAN[2] = {0x00000000, 0x7ff80000};
const double LITERAL_NAN = *( double* )dNAN;

Обратите внимание, что это не стандартный способ. На Microsoft C он отлично работает.