Apakah ini mungkin untuk menetapkan a NaN
ke double
atau float
di C / C ++? Seperti di JavaScript Anda lakukan: a = NaN
. Jadi nanti Anda dapat memeriksa apakah variabel itu angka atau tidak.
Apakah ini mungkin untuk menetapkan a NaN
ke double
atau float
di C / C ++? Seperti di JavaScript Anda lakukan: a = NaN
. Jadi nanti Anda dapat memeriksa apakah variabel itu angka atau tidak.
Jawaban:
Dalam C, NAN
dideklarasikan dalam<math.h>
.
Dalam C ++, std::numeric_limits<double>::quiet_NaN()
dideklarasikan dalam <limits>
.
Namun untuk memeriksa apakah suatu nilai adalah NaN, Anda tidak dapat membandingkannya dengan nilai NaN lainnya. Sebagai gantinya gunakan isnan()
dari <math.h>
dalam C, atau std::isnan()
dari <cmath>
dalam C ++.
x == x
mengembalikan false
iff x
adalah NaN.
Seperti yang ditunjukkan orang lain, Anda mencari std::numeric_limits<double>::quiet_NaN()
meskipun saya harus mengatakan saya lebih suka dokumen cppreference.com . Terutama karena pernyataan ini agak kabur:
Hanya berarti jika std :: numeric_limits :: has_quiet_NaN == true.
dan mudah untuk mengetahui apa artinya ini di situs ini, jika Anda memeriksa bagian mereka di std::numeric_limits::has_quiet_NaN
situ tertulis:
Konstanta ini bermakna untuk semua tipe floating-point dan dijamin benar jika std :: numeric_limits :: is_iec559 == true.
yang seperti yang dijelaskan di sini jika true
berarti platform Anda mendukung IEEE 754
standar. Ini thread sebelumnya menjelaskan ini harus berlaku untuk kebanyakan situasi.
Ini dapat dilakukan menggunakan numeric_limits di C ++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Ini adalah metode yang mungkin ingin Anda lihat:
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.
Apakah ini mungkin untuk menetapkan NaN ke double atau float di C ...?
Ya, karena C99, (C ++ 11) <math.h>
menawarkan fungsi di bawah ini:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
yang seperti strtod("NAN(n-char-sequence)",0)
rekan mereka dan NAN
untuk tugas.
// 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);
Contoh keluaran: (Tergantung implementasi)
(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)