arccos((sin(x)^2)+cos(x)^2) 对于某些角度不为 0
arccos((sin(x)^2)+cos(x)^2) is not 0 for certain angles
我正在为一道简单的计算题苦苦挣扎。
理论上任意角度:
如果
是
如果我在 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
它实际上也是 0 使用 -89.999962°,但它又是 1.49011612e-08 for alpha = -89.9999°
有谁知道这是什么原因,哪些角度会导致结果大于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
这样的主题,您可能会对此有所了解以及如何处理它。
解决了任意角度的问题。余弦以数值问题着称(例如https://www.nayuki.io/page/numerically-stable-law-of-cosines)
我正在为一道简单的计算题苦苦挣扎。
理论上任意角度:
如果
是
如果我在 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
它实际上也是 0 使用 -89.999962°,但它又是 1.49011612e-08 for alpha = -89.9999°
有谁知道这是什么原因,哪些角度会导致结果大于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
这样的主题,您可能会对此有所了解以及如何处理它。
解决了任意角度的问题。余弦以数值问题着称(例如https://www.nayuki.io/page/numerically-stable-law-of-cosines)