numeric - arccos((sin(x)^2)+cos(x)^2) 对于某些角度不为 0
问题描述
我正在努力解决一个简单的计算问题。
根据任意角度的理论:
如果
是
如果我在 python 或 Matlab 中实现它:
import numpy as np
alpha = -89.999961
alpha_rad = np.deg2rad(alpha)
result = np.arccos(np.sin(alpha_rad)**2 + np.cos(alpha_rad)**2)
print('%.16f' % result)
导致
0.0000000149011612
然而
alpha = -89.9999601
导致
0.0000000000000000
使用 -89.999962° 它实际上也为 0,但对于 alpha = -89.9999° 它再次为 1.49011612e-08
有谁知道这是什么原因以及哪些角度会导致结果大于 0。我不是数值数学方面的专家,但浮点数的间距要小得多(2.220446049250313e-16)。我想将结果与一个大数相乘,所以如果结果在浮点数间距方面为 0,那就太好了。
非常欢迎任何帮助和解释!
解决方案
在 Java 和其他编程语言中也是如此。浮点数的小数部分是有限的,因此在解析某些值时会出现计算错误。所以在某些情况下,你需要四舍五入才能得到预期的结果。
这是同一问题的 Java 示例。
double[] angles = { 23.4, 22, 78.3, 92.4
};
for (double a : angles) {
double val = Math.sin(a) * Math.sin(a) + Math.cos(a) * Math.cos(a);
System.out.println(Math.acos(val) + " " + a);
System.out.println("-------------------------------");
}
}
如果您搜索类似的主题,dealing with floating point errors
您可能会对此有所了解以及如何处理它。