首页 > 解决方案 > 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,那就太好了。

非常欢迎任何帮助和解释!

标签: numericangleepsilon

解决方案


在 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您可能会对此有所了解以及如何处理它。


推荐阅读