Przejdź do zawartości

C/nan

Z Wikibooks, biblioteki wolnych podręczników.
< C

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]

math.h

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]
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.


  1. wg IBM