importar - math.pow java
tan 45 me da 0.9999 (4)
¿Por qué tan 45
(0.7853981633974483 en radianes) me da 0.9999
? ¿Qué pasa con el siguiente código?
System.out.println(Math.tan(Math.toRadians(45.0)) );
No creo que haya ningún error tipográfico aquí.
Entonces, ¿cuál es la solución aquí?
El double
más cercano a pi/4
es exactamente 0x1.921fb54442d18p-1
. La tangente de este doble, a más bits de los que necesita, es 0x1.fffffffffffff72cece67p-1
. Si redondeas al double
más cercano obtendrás exactamente 0x1.fffffffffffffp-1
porque 0x1.fffffffffffff72cece67p-1
es menor que 0x1.fffffffffffff8p-1
.
Eso es probablemente porque tan(45)
es 1, y el resto es un error de redondeo. Es muy poco probable que los cálculos de punto flotante le den resultados precisos, debido a la forma en que funcionan los cálculos de coma flotante.
Los cálculos de puntos flotantes a menudo conducirán a tales imprecisiones. El problema es que los números no se pueden representar con precisión dentro de un número fijo de bits.
Para darle otro ejemplo (en decimal), todos estamos de acuerdo en que 3 * (1/3) = 1
. Sin embargo, si su calculadora solo tiene 4 decimales, 1/3
se representaría como 0.3333
. Cuando eso se multiplica con 3
, obtendrías 0.9999
no 1
.
Como información adicional, los puntos flotantes en la mayoría de los sistemas generalmente se representan utilizando el estándar IEEE754. Puede buscarlo o consultar la página de Wikipedia para obtener más detalles. Punto flotante IEEE
Utilizar esta
double radians = Math.toRadians(45.0);
System.out.format("The tangent of 45.0 degrees is %.4f%n", Math.tan(radians));