ja7*_*a72 7 c# clr trigonometry
我对CLR中内在触发功能的不准确性感到非常恼火.众所周知
Math.Sin(Math.PI)=0.00000000000000012246063538223773
Run Code Online (Sandbox Code Playgroud)
而不是0.发生类似的事情Math.Cos(Math.PI/2).
但是当我进行一系列长时间的计算时,我会对特殊情况进行评估
Math.Sin(Math.PI/2+x)-Math.Cos(x)
Run Code Online (Sandbox Code Playgroud)
对于x = 0.2,结果为零,但对于x = 0.1,结果为零(试一试).另一个问题是当论证数量很大时,不准确性会成比例地变大.
所以我想知道是否有人编写了一些更好的C#中的trig函数表示,以便与世界共享.CLR是否调用了一些实现CORDIC或类似的标准C数学库?链接:维基百科CORDIC
Dar*_*rov 18
这与三角函数的准确性无关,但与CLS类型系统有关.根据文档,双精度具有15-16位精度(这正是你得到的)所以你不能更精确地使用这种类型.因此,如果您想要更高的精度,则需要创建一个能够存储它的新类型.
另请注意,您永远不应该编写如下代码:
double d = CalcFromSomewhere();
if (d == 0)
{
DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
你应该这样做:
double d = CalcFromSomewhere();
double epsilon = 1e-5; // define the precision you are working with
if (Math.Abs(d) < epsilon)
{
DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
我听到你了.我对分裂的不准确感到非常恼火.前几天我做了:
Console.WriteLine(1.0 / 3.0);
Run Code Online (Sandbox Code Playgroud)
我得到了0.333333333333333,而不是0的正确答案.333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333 ...
也许现在你看到问题所在.Math.Pi不等于pi,超过1.0/3.0等于三分之一.它们都与真值相差几百万亿分之一,因此您使用Math.Pi或1.0/3.0执行的任何计算也将减少几百万亿分之一,包括采用正弦.
如果你不喜欢近似算术是近似的,那么不要使用近似算术.使用精确算术.当我需要精确的算术时,我曾经使用滑铁卢枫树; 也许你应该买一份.
这是浮点精度的结果.您可以获得一定数量的有效数字,并且任何无法准确表示的数字都是近似的.例如,pi不是一个有理数,因此不可能得到精确的表示.既然你无法得到精确的pi值,那么你就不会得到包括pi在内的精确正弦数和余弦数(在大多数情况下你也不会得到精确的正弦值和余弦值).
最好的中间解释是"每个计算机科学家应该知道的浮点运算".如果你不想进入那个,只要记住浮点数通常是近似值,浮点计算就像在地上移动成堆的沙子:你用它做的一切,你会失去一点沙子和拿起一点污垢.
如果你想要精确的表示,你需要找到一个象征性的代数系统.