Math.sin(Math.PI)返回1.2246467991473532E-16Math.sin(-Math.PI)返回-1.2246467991473532E-16但是它不能返回零吗?虽然3.14和3.15的sin是正确的。
Math.sin(Math.PI)
1.2246467991473532E-16
Math.sin(-Math.PI)
-1.2246467991473532E-16
3.14
3.15
omhiaaxx1#
Math.PI不是“精确的”π,它只是π的近似值(3.141592653589793)。没有浮点格式可以精确存储π。这就是为什么你不能得到精确的零。
Math.PI
ecfdbz9o2#
你不能精确地表示PI,所以你不能期望得到精确的结果。如果你认为这是一个错误,我建议你把结果四舍五入。将其打印为(int)Math.sin(Math.PI),将得到0请注意,Math.sin到int将始终给予0或-1
(int)Math.sin(Math.PI)
Math.sin
pb3skfrl3#
计算机中浮点函数的本质是它们不精确(参见Drop的链接)。如果你想四舍五入值到2(或任何)位数后,点的功能,你可以这样做
(Math.rint(1e2*Math.sin(Math.PI)))/1e2
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是一个很好的近似值。
sin(π + ε) ≈ -ε
double
π + ε
sin(Math.PI)
-ε
π - Math.PI
4条答案
按热度按时间omhiaaxx1#
Math.PI
不是“精确的”π,它只是π的近似值(3.141592653589793)。没有浮点格式可以精确存储π。这就是为什么你不能得到精确的零。ecfdbz9o2#
你不能精确地表示PI,所以你不能期望得到精确的结果。如果你认为这是一个错误,我建议你把结果四舍五入。
将其打印为
(int)Math.sin(Math.PI)
,将得到0请注意,
Math.sin
到int将始终给予0或-1pb3skfrl3#
计算机中浮点函数的本质是它们不精确(参见Drop的链接)。
如果你想四舍五入值到2(或任何)位数后,点的功能,你可以这样做
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是一个很好的近似值。