Apakah ini mungkin untuk menetapkan a NaNke doubleatau floatdi C / C ++? Seperti di JavaScript Anda lakukan: a = NaN. Jadi nanti Anda dapat memeriksa apakah variabel itu angka atau tidak.
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 ++.
Atau Anda dapat membandingkan angkanya dengan dirinya sendiri - x == xmengembalikan falseiff xadalah NaN.
Archie
7
@Archie: Saya rasa itu tidak dijamin dalam kedua bahasa.
Mike Seymour
3
@MikeSeymour Bukan dengan standar bahasa tetapi sejauh yang saya tahu itu harus berfungsi jika kompilator mengklaim mematuhi IEEE.
Pixelchemist
37
@Pixelchemist: Memang, ini adalah opsi jika Anda memerlukan kebingungan tetapi bukan portabilitas. Secara pribadi, saya lebih suka portabilitas tanpa kebingungan, jadi saya tidak akan menyarankannya sendiri.
Mike Seymour
9
catatan kecil: NAN adalah float, bukan double. link
orion elenzil
23
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_NaNsitu 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 trueberarti platform Anda mendukung IEEE 754standar. Ini thread sebelumnya menjelaskan ini harus berlaku untuk kebanyakan situasi.
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.
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, ataustd::isnan()
dari<cmath>
dalam C ++.sumber
x == x
mengembalikanfalse
iffx
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:dan mudah untuk mengetahui apa artinya ini di situs ini, jika Anda memeriksa bagian mereka di
std::numeric_limits::has_quiet_NaN
situ tertulis:yang seperti yang dijelaskan di sini jika
true
berarti platform Anda mendukungIEEE 754
standar. Ini thread sebelumnya menjelaskan ini harus berlaku untuk kebanyakan situasi.sumber
Ini dapat dilakukan menggunakan numeric_limits di C ++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Ini adalah metode yang mungkin ingin Anda lihat:
sumber
Ya, karena C99, (C ++ 11)
<math.h>
menawarkan fungsi di bawah ini:yang seperti
strtod("NAN(n-char-sequence)",0)
rekan mereka danNAN
untuk tugas.Contoh keluaran: (Tergantung implementasi)
sumber