C / C ++ NaN-константа (буквально)?


110

Чи можливо це призначити NaNa doubleабо floatC / C ++? Як і в JavaScript ви: a = NaN. Тож пізніше ви можете перевірити, чи є змінною число чи ні.


Тут я покажу , як різні NaNs виглядати, коли генеруються різними способами: stackoverflow.com/questions/18118408 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

Відповіді:


153

В C, NANоголошено в <math.h>.

В C ++, std::numeric_limits<double>::quiet_NaN()оголошено в <limits>.

Але для перевірки того, чи є значення NaN, ви не можете порівняти його з іншим значенням NaN. Замість того, щоб використовувати isnan()з <math.h>в C, або std::isnan()з <cmath>в C ++.


20
Або ви можете порівняти число до себе - x == xповертає falseiff xце NaN.
Арчі

7
@Archie: Я не думаю, що це гарантовано на будь-якій мові.
Майк Сеймур

3
@MikeSeymour Не за мовним стандартом, але, наскільки я знаю, це має працювати, якщо компілятор претендує на сумісність з IEEE.
Піксельхімік

37
@Pixelchemist: Дійсно, це варіант, якщо вам потрібна припухлість, але не переносимість. Особисто я віддаю перевагу переносимості без обтурації, тому сам не підкажу.
Майк Сеймур

9
незначна примітка: NAN - поплавок, а не подвійний. посилання
orion elenzil

23

Як зазначають інші, ви шукаєте, std::numeric_limits<double>::quiet_NaN()хоча мушу сказати, що я віддаю перевагу документам cppreference.com . Тим більше, що це твердження трохи розпливчасте:

Змістовне лише, якщо std :: numeric_limits :: has_quiet_NaN == true.

і було легко зрозуміти, що це означає на цьому веб-сайті, якщо ви перевірите їх розділ на std::numeric_limits::has_quiet_NaNньому:

Ця константа має значення для всіх типів з плаваючою комою і гарантовано є правдивою, якщо std :: numeric_limits :: is_iec559 == true.

що пояснено тут, якщо trueозначає, що ваша платформа підтримує IEEE 754стандарт. Цей попередній потік пояснює, що це має бути правдою для більшості ситуацій.


9

Це можна зробити за допомогою numeric_limits в C ++:

http://www.cplusplus.com/reference/limits/numeric_limits/

Це, напевно, ви хочете переглянути:

infinity()  T   Representation of positive infinity, if available.
quiet_NaN() T   Representation of quiet (non-signaling) "Not-a-Number", if available.
signaling_NaN() T   Representation of signaling "Not-a-Number", if available.

6
+1. У Вікіпедії є деяка інформація про спокійний NaN та сигналізацію NaN .
Дрю Ноакс

1

Чи можливо це призначити NaN подвійним або плавати в C ...?

Так, оскільки C99, (C ++ 11) <math.h>пропонує наступні функції:

#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);

які схожі на їхніх strtod("NAN(n-char-sequence)",0)колег та NANдля виконання завдань.

// Sample C code
uint64_t u64;
double x;
x = nan("0x12345");
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = -strtod("NAN(6789A)",0);
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = NAN;
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);

Вибірка зразка: (Залежність від реалізації)

(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)

1
Які відмінності між результатами для різних рядків? Який із них слід використовувати в типовому числовому коді?
Quant_dev
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.