Чи можливо це призначити NaN
a double
або float
C / C ++? Як і в JavaScript ви: a = NaN
. Тож пізніше ви можете перевірити, чи є змінною число чи ні.
Чи можливо це призначити NaN
a double
або float
C / C ++? Як і в JavaScript ви: a = NaN
. Тож пізніше ви можете перевірити, чи є змінною число чи ні.
Відповіді:
В C, NAN
оголошено в <math.h>
.
В C ++, std::numeric_limits<double>::quiet_NaN()
оголошено в <limits>
.
Але для перевірки того, чи є значення NaN, ви не можете порівняти його з іншим значенням NaN. Замість того, щоб використовувати isnan()
з <math.h>
в C, або std::isnan()
з <cmath>
в C ++.
x == x
повертає false
iff x
це NaN.
Як зазначають інші, ви шукаєте, 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
стандарт. Цей попередній потік пояснює, що це має бути правдою для більшості ситуацій.
Це можна зробити за допомогою 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.
Чи можливо це призначити 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)