NaN буквально в C? - PullRequest
       19

NaN буквально в C?

17 голосов
/ 19 апреля 2011

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

Ответы [ 4 ]

17 голосов
/ 19 апреля 2011

В С99 <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.           |
7 голосов
/ 19 апреля 2011

5.2.4.2.2 / 3:

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

7.12 / 5 (математ. Ч):

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

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

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

3 голосов
/ 19 апреля 2011

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

2 голосов
/ 06 октября 2014

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

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

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

...