distinto de cero, el valor de precisión doble que más se acerca a un múltiplo exacto de π/2 es 6381956970095103 * 2^797 , que es igual a:
(an odd integer) * π/2 + 2.983942503748063...e−19
por lo tanto, para todos los valores de precisión doble x, tenemos el límite:
|cos(x)| >= cos(2.983942503748063...e−19)
Tenga en cuenta que este es un límite en el valor matemáticamente exacto, no en el valor devuelto por la función de biblioteca cos
. En una plataforma con una biblioteca matemática de buena calidad, este límite es lo suficientemente bueno para que podamos decir que cos(x)
no es cero para ninguna precisión doble x
. De hecho, resulta que esto no es exclusivo del doble; esta propiedad es válida para todos los tipos básicos de IEEE-754, si cos
se redondea fielmente.
Sin embargo, eso no quiere decir que esto nunca podría ocurrir en una plataforma que tuvo una implementación espectacularmente pobre de reducción de argumento trigonométrico.
Aún más importante, es fundamental tener en cuenta que en su ejemplo y
puede ser infinita sincos(a)
siendo cero:
#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;
}
compilar y ejecutar:
scanon$ clang example.c && ./a.out
cos(a) = -4.68717e-19
h/cos(a) = -inf
ocasiones, el sistema podría forzarlo cero cuando 'a' es aprox. igual a 'pi/2'. – ja72