【发布时间】:2010-07-14 19:25:54
【问题描述】:
我对 CLR 中固有的三角函数的不准确性感到非常恼火。众所周知
Math.Sin(Math.PI)=0.00000000000000012246063538223773
而不是 0。Math.Cos(Math.PI/2) 会发生类似的情况。
但是当我进行一系列计算时,在特殊情况下评估为
Math.Sin(Math.PI/2+x)-Math.Cos(x)
x=0.2 的结果为零,但 x=0.1 的结果不为零(试试看)。另一个问题是当参数很大时,不准确性会成比例地变大。
所以我想知道是否有人用 C# 编写了一些更好的三角函数表示,以便与世界分享。 CLR 是否调用了一些实现 CORDIC 或类似的标准 C 数学库?链接:wikipedia CORDIC
【问题讨论】:
-
您认为将 pi 表示为 double 的准确度如何?
-
如果你想要符号数学,就做符号数学。如果你使用浮点类型,你会得到有限的精度。
-
-1 表示没有“做作业”,也表示认为
System.Math是 C# 的一部分(提示:它是 .NET Framework 的一部分)。 -
如果您以英里为单位测量地球的位置,如上所示,Math.Sin(Math.PI) 将给出一个相差十分之七英寸的位置。您正在开发什么应用程序需要如此精确?!
-
@jalexiou:如果您正在处理涉及微分方程和数值积分的动力学问题,所有这些问题都是浮点数,那么 pi 值的几万亿分之一的不准确性可能是您的问题中最少的问题。微分方程和求积的数值逼近算法存在许多众所周知的误差项增长过大问题。如果您想继续追求数值逼近解决方案,请选择一本关于数值方法的优秀本科教材。如果你想用精确的算术来做数学,找mathematica或maple之类的工具。
标签: c# clr trigonometry