C/nan
Wygląd
Deklaracja
[edytuj]double nan (const char *tagp); float nanf(const char *tagp); long double nanl(const char *tagp); #define NAN wartość
Plik nagłówkowy
[edytuj]Argumenty
[edytuj]- tagp
- ciąg znaków do którego są zapisywana dodatkowe informacjami o zwracanej wartości
Opis
[edytuj]Wywołanie funkcji jest równoważne wywołaniu strtod("NAN(parametr)", 0) lub strtod("NAN", 0) (albo odpowiednio strotof lub strtold), gdzie parametr jest ciągiem znaków wskazywanym przez tagp.
Makro NAN jeżeli jest zdefiniowane, ma wartość wyrażenia typu float reprezentującego wartość NaN.
Wartość zwracana
[edytuj]- Wartość NAN, chyba że w implementacji nie występuje cicha reprezentacja NaN, wówczas funkcje zwracają 0.
- tagp zawierający dodatkowe informacje o NAN
Przykład użycia
[edytuj]- wg IBM[1]
double a_nan = strtod("NaN", NULL);
#include <stdio.h> /* printf */
#include <math.h> /* isnan */
int main()
{
double d1;
double d2;
double d3;
int inan;
//char *tagp;
d1 = sqrt (-1) ; // NAN and exceptions defined in IEEE 754 : ‘Invalid Operation’
/* Checks for nan via x != x are sometimes unreliable (x != x being stripped out by some optimizing compilers that break IEEE compliance, specifically when the -ffast-math switch is enabled). */
if (d1 != d1) printf ("number %f = %g = %e is a NAN \n",d1, d1, d1);
else printf ("???1 \n");
d2 = 0.0/0.0; // NAN and exceptions defined in IEEE 754 : ‘Invalid Operation’
if (isnan(d2)) printf ("number %f = %g = %e is a NAN \n",d2, d2, d2);
else printf ("???2 \n");
// http://pic.dhe.ibm.com/infocenter/zos/v2r1/index.jsp?topic=%2Fcom.ibm.zos.v2r1.bpxbd00%2Fnan.htm%7Cnan
// http://www.opensource.apple.com/source/Libm/Libm-2026/Source/nan.c
d3=nan("");
if (isnan(d3)) printf ("number %f = %g = %e is a NAN \n",d3, d3, d3);
else printf ("???3 \n");
// http://stackoverflow.com/questions/1923837/how-to-use-nan-and-inf-in-c
inan = 0x7F800001;
if (isnan(*(float*)&inan)) printf ("number %f = %g = %e is a NAN \n",d2, d2, d2);
else printf ("???4 \n");
return 0;
}
// http://en.cppreference.com/w/c/numeric/math/nan
#include <stdio.h>
#include <math.h>
#include <stdint.h>
#include <inttypes.h>
#include <string.h>
int main(void)
{
double f1 = nan("1");
uint64_t f1n; memcpy(&f1n, &f1, sizeof f1);
printf("nan(\"1\") = %f (%" PRIx64 ")\n", f1, f1n);
double f2 = nan("2");
uint64_t f2n; memcpy(&f2n, &f2, sizeof f2);
printf("nan(\"2\") = %f (%" PRIx64 ")\n", f2, f2n);
}
Uwagi
[edytuj]Funkcja została dodana do języka w standardzie C99.
W przypadku użycia funkcji matematycznych może zaistnieć konieczność podania odpowiedniego argumentu linkerowi, aby ten połączył program z biblioteką matematyczną. Np. na systemach GNU/Linux jest to -lm.