C#Cos&;科萨

C#Cos&;科萨,c#,trigonometry,floating-point-precision,C#,Trigonometry,Floating Point Precision,我遇到了一些应该很容易回答的问题,但我无法用手指去触摸。我已经很久没有做过三角学了 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.W

我遇到了一些应该很容易回答的问题,但我无法用手指去触摸。我已经很久没有做过三角学了

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

为什么
cosValue
cos
不一样

您是否注意到这两个值接近0,并且彼此接近

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

您可能会通过一个科学的库实现更好的精度(您真的需要它吗),专门用于此,并使用比Double更高精度的类型。
你可能会在或中发现一些有趣的东西,它们都大约为零;)的确对我来说,这听起来像是一个简单的浮点精度问题。问题应该是:数学函数的精度保证是什么?事实上,对这两个值调用
Math.Acos
,得到的弧度值是相同的。嗯,如果不是相同的话,我会认为它们会非常接近。谢天谢地,我们的银行信息并不依赖于Sin/Cos方法。不,一开始我没有注意到这一点。我很惊讶这些价值观不一样,我理解这一点。您可以计算Cos(6.12303176911189E-17),它可能会输出非常接近相关角度的结果。有趣的是,我们可以循环使用它,看看在几次迭代之后漂移是否会持续增加:)。我希望我的回答是有帮助的!