różny od zera, podwójną wartość dokładności, która pochodzi najbliżej dokładną wielokrotnością p/2 jest 6381956970095103 * 2^797 , która jest równa:
(an odd integer) * π/2 + 2.983942503748063...e−19
Zatem dla wszystkich wartości double-precision x, mamy związanego:
|cos(x)| >= cos(2.983942503748063...e−19)
Należy zauważyć, że jest to związane z matematycznie dokładną wartością, a nie z wartością zwracaną przez funkcję biblioteczną cos
. Na platformie z biblioteką matematyczną dobrej jakości ta granica jest wystarczająco dobra, aby można powiedzieć, że cos(x)
nie jest zerem dla jakiejkolwiek podwójnej precyzji x
. W rzeczywistości okazuje się, że nie jest to jednoznacznie podwójne; ta właściwość dotyczy wszystkich podstawowych typów IEEE-754, jeśli cos
jest wiernie zaokrąglona.
Nie można jednak powiedzieć, że to nigdy nie mogło wystąpić na platformie, która miała spektakularnie słabą implementację redukcji argumentów trygonometrycznych.
Co ważniejsze, jest to krytyczny zauważyć, że w przykładzie y
może być nieskończony bezcos(a)
zerowej:
#include <math.h>
#include <stdio.h>
int main(int argc, char *argv[]) {
double a = 0x1.6ac5b262ca1ffp+849;
double h = 0x1.0p1022;
printf("cos(a) = %g\n", cos(a));
printf("h/cos(a) = %g\n", h/cos(a));
return 0;
}
skompilować i uruchomić:
scanon$ clang example.c && ./a.out
cos(a) = -4.68717e-19
h/cos(a) = -inf
Czasami system może go zmusić zero, gdy "a" jest ok. równy 'pi/2'. – ja72