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