libreria importar functions java math floating-point precision trigonometry

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));