C/Zaawansowane operacje matematyczne: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
m →‎Liczby subnormalne: przybliżenia DBL_MIN i liczby subnormalnej
Linia 851:
====Liczby subnormalne====
 
=====przybliżenia DBL_MIN i liczby subnormalnej =====
 
Korzystając z funkcji [[C/isnormal|isnormal]] zdefiniowanej w pliku math.h możemy samodzielnie poszukać przybliżenia DBL_MIN i liczby subnormalnej.
 
Linia 916:
number 0.000000 = 2.22507e-308 = 2.225074e-308 is a approximation of minimal positive double normal
number 0.000000 = 1.11254e-308 = 1.112537e-308 is not normal ( subnormal)
 
 
</pre>
=====eliminacja liczb subnormalnych=====
Ten program generuje liczby subnormale:
<source lang=c>
/*
https://blogs.oracle.com/d/subnormal-numbers
gcc -O0 f.c
*/
#include <stdio.h>
void main()
{
double d=1.0;
while (d>0) {printf("%e\\n",d); d=d/2.0;}
}
 
</source>
 
 
wynik:
<source lang=bash>
1.000000e+00
5.000000e-01
2.500000e-01
1.250000e-01
6.250000e-02
3.125000e-02
...
3.162020e-322
1.581010e-322
7.905050e-323
3.952525e-323
1.976263e-323
9.881313e-324
4.940656e-324
</source>
 
Jeśli jednak skompilujemy go z opcję:
 
gcc -O0 -ffast-math f.c
 
to otrzymamy:
 
<source lang=bash>
...
3.560118e-307
1.780059e-307
8.900295e-308
4.450148e-308
2.225074e-308
</source>
 
Liczby subnormalne są zaokrąglane do zera.
 
===część ułamkowa===
Za pomocą:<ref>[https://stackoverflow.com/questions/499939/extract-decimal-part-from-a-floating-point-number-in-c stackoverflow question : extract-decimal-part-from-a-floating-point-number-in-c]</ref>