最近发现编译器一个求解三角函数的Bug,求解决
1、我在使用VS2010的VB.NET提供的Math类的三角函数的运算的时候,发现对绝对值大于9.22337203685477E+18的数据进行三角函数运算时无能为力.比如Math.sin(4E20)=4E20,Math.cos(-4E20)=-4E20……,即sin(a)=a,这明显是错误的.
2、由于Double类型可表示的正数数据范围为4.94065645841247E-324到1.79769313486231E308,对于上面4E20根本就还没有超出这个范围,居然VB.NET提供的Math类却算不出来,这是我没有想到的.
3、由于自己算的数据有时候可能会大于9.22337203685477E+18,为了解决这个问题,特来求教.当然,我之前考虑过sin(a+2nπ)=sin(a)这种解决方案,但是代码执行后总是出错;自己也考虑过三角函数的泰勒展开的问题,但是由于数据太大,收敛慢,就没有考虑.在这里,如果您有什么想法,请您赐教,当然有代码就最好!
4、顺便说一下,我在C语言里面测试了下,使用Math.h头文件计算结果为:sin(4e20)=-0.133932;
而我在使用Matlab计算sin(4e20)=-0.329887142431847;
[解决办法]
更正楼上代码:
不位移也可以,Decimal小数类型可以带一位整数。
- VB.NET code
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click If IsNumeric(TextBox1.Text) = True Then Dim PI As Decimal Dim P As String = "3.1415926535897932384626433833" PI = CDec(P) Label1.Text = Math.Sin(CDec(TextBox1.Text) - Math.Truncate(CDec(TextBox1.Text) / (2 * PI)) * 2 * PI) End If End Sub