在C#中的三角函数:余弦和余弦角

3

我遇到了一个非常简单但却无法解答的问题。我已经有一段时间没有做三角学了。

double cosValue = -2.7105054312E-20;
// (ACos) returns the angle
var deducedAngleInRadian = System.Math.Acos(cosValue);
var cos = System.Math.Cos(deducedAngleInRadian);

Console.WriteLine(cosValue);
Console.WriteLine(deducedAngleInRadian);
Console.WriteLine(cos);

输出:

-2.7105054312E-20
1.5707963267949
6.12303176911189E-17

为什么cosValuecos不一样呢?


6
两者大致都是零。;) - 500 - Internal Server Error
4
没错。在我看来,这听起来像是一个简单的浮点精度问题。 - Jon Skeet
问题应该是:数学函数提供什么准确性保证? - usr
事实上,在这两个值上调用 Math.Acos 函数会得到相同的弧度值。 - Jon Skeet
@DLeh,没有浮点类型可以返回精确结果。 - DixonD
2
嗯,我本以为它们应该非常接近,甚至是相同的。感谢上帝我们的银行信息不依赖于Sin/Cos方法。 - Sam
1个回答

2

你是否注意到这两个值非常接近于0,而且彼此之间也很接近?

浮点数的(不)精度和每种方法的实现可能可以完美地解释这一点。这些方法并不完美,例如它们依赖于Pi的近似值(当然,因为Pi无法在计算机中存储;)。

你可能可以通过使用专门用于此类操作并使用比Double更高精度类型的科学库来实现更好的精度(你真的需要吗)。你可能会在Math operations using System.Decimal in C#?https://stackoverflow.com/questions/1387430/recommended-math-library-for-c-net中找到一些有趣的东西。


我一开始没有注意到这点。我很惊讶这些值不一样。 - Sam
我明白了。你可以计算Cos(6.12303176911189E-17),它可能会输出一个非常接近相关角度的结果。循环一下可能会很有趣,看看漂移是否在几次迭代后持续增加 :)。希望我的回答有所帮助! - AFract

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接