java sin返回意外结果

xcitsw88  于 2023-06-28  发布在  Java
关注(0)|答案(4)|浏览(154)

Math.sin(Math.PI)返回1.2246467991473532E-16
Math.sin(-Math.PI)返回-1.2246467991473532E-16
但是它不能返回零吗?
虽然3.143.15的sin是正确的。

omhiaaxx

omhiaaxx1#

Math.PI不是“精确的”π,它只是π的近似值(3.141592653589793)。没有浮点格式可以精确存储π。这就是为什么你不能得到精确的零。

ecfdbz9o

ecfdbz9o2#

你不能精确地表示PI,所以你不能期望得到精确的结果。如果你认为这是一个错误,我建议你把结果四舍五入。
将其打印为(int)Math.sin(Math.PI),将得到0
请注意,Math.sin到int将始终给予0或-1

pb3skfrl

pb3skfrl3#

计算机中浮点函数的本质是它们不精确(参见Drop的链接)。
如果你想四舍五入值到2(或任何)位数后,点的功能,你可以这样做

(Math.rint(1e2*Math.sin(Math.PI)))/1e2
tvokkenx

tvokkenx4#

正如其他人所指出的,根本原因是Math.PI不是(也不可能是)精确的π。这已经解释了为什么答案不应该是零,但我们可以更具体地解释为什么答案是1.2246467991473532E-16。
对于小的ε值,π附近的正弦函数可以近似为sin(π + ε) ≈ -ε
将π四舍五入到最接近的double得到double,其值(精确地)为3.141592653589793115997963468544185161590576171875,这就是Math.PI。这个值不是(也不可能是)精确的π,但对于一些小的ε,它可以写成π + ε(这个数字毕竟非常接近π)。由于sin(π + ε) ≈ -εsin(Math.PI)实际上应该给予我们,四舍五入到最接近的double
π - Math.PI是1.22464679914735317722606593227500... × 10-16 according to Wolfram Alpha,1.2246467991473532E-16是一个很好的近似值。

相关问题