C/isnormal
< C
Makro sprawdzające
Składnia
edytuj- Parametr: arg - wartość zmiennoprzecinkowa
- Wartość zwracane: Niezerowa wartość całkowita, jeśli arg jest normalny, 0 w przeciwnym razie.
kod żródłowy
edytujSzukamy:
grep -i isnormal /usr/include/math.h
# define isnormal(x) __builtin_isnormal (x)
# define isnormal(x) (fpclassify (x) == FP_NORMAL)
Czyli jest to:
- makro
- korzystające z fpclassify
- zdefiniowane w pliku nagłówkowym math.h
Przykład
edytujPierwszy przykład[1]
#include <stdio.h>
#include <math.h>
#include <float.h>
int main(void)
{
printf("isnormal(NAN) = %d\n", isnormal(NAN));
printf("isnormal(INFINITY) = %d\n", isnormal(INFINITY));
printf("isnormal(0.0) = %d\n", isnormal(0.0));
printf("isnormal(DBL_MIN/2.0) = %d\n", isnormal(DBL_MIN/2.0));
printf("isnormal(1.0) = %d\n", isnormal(1.0));
}
Kompilacja
Wynik:
isnormal(NAN) = 0
isnormal(INFINITY) = 0
isnormal(0.0) = 0
isnormal(DBL_MIN/2.0) = 0
isnormal(1.0) = 1
Drugi przykład
/*
isnormal example
ISO C99
http://www.cplusplus.com/reference/cmath/isnormal/
http://www.gnu.org/software/libc/manual/html_node/Floating-Point-Classes.html
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_math.html
compile with:
gcc -std=c99 -lm s.c
run :
./a.out
*/
#include <stdio.h> /* printf */
#include <math.h> /* isnormal, fpclassify */
int TestNumber(double x)
{
int f; // flag
f= isnormal(x);
if (f)
printf ( "number %.16e is normal \n",x);
else printf ("number %.16e is not normal \n",x);
return f;
}
//----------------------------
int main()
{
double d = 1.0;
double MinNormal= 1.0;
int f = 0;
d = 1.0 ; // normal
f = TestNumber(d);
while (f)
{
MinNormal=d;
d /=2.0;
f = TestNumber(d);
}
printf ("\n\number %.16f = %.16eis minimal normal \n",MinNormal, MinNormal);
printf ("number %.16e is not normal \n",d);
return 0;
}