2012-01-25 19 views
4

我创建的一个计算器程序几乎完美的工作,除了Math.Sin()和Math.Log()似乎有一些不准确之处,我不能似乎到了最底层。我会尽力给予尽可能多的细节。C#Math.Sin()和Math.Log()不准确

Math.Sin()问题:

首先,这不是一个弧度的问题(至少到目前为止我可以告诉)。数字作为double输入Math.Sin()。它适用于度和弧度的某些值,但不适用于其他像180和pi的其他值。现在的一些代码:

private void buttonSin_Click(object sender, EventArgs e) 
    { 
     if (radioDeg.Checked) 
     { 
      firstOperand = Math.PI/180*firstOperand; 
     } 
     firstOperand = Math.Sin(firstOperand); 
     secondOperand = 0; 
     displayScreen.Text = firstOperand.ToString(); 
     clickCount = 0; 
     operationCount++; 
    } 

firstOperand为双并(与第二操作数一起)用于将举行后续计算。我认为代码的其他部分是不言自明的,但如果有必要,我会很乐意详细说明。 Math.Sin(Math.PI)= 1.224 ...而不是0,因为它应该。但Math.Sin(Math.PI/4)= 0.707 ...正如所料。此外,这只有当pi生成为Math.PI时才是如此。如果输入手动为3.14159,Math.Sin()= 2.65 ...如果输入为3.1415926我得到Math.Sin()= 5.35 ...任何人都可以指出为什么?

Math.Log()问题:

这部分工作几乎是完美的。唯一的错误发生在连续应用该功能时。看看代码:

private void buttonLn_Click(object sender, EventArgs e) 
    { 
     firstOperand = Math.Log(firstOperand); 
     secondOperand = 0; 
     displayScreen.Text = firstOperand.ToString(); 
     clickCount = 0; 
     operationCount++; 
    } 

Math.Log(Math.E)以= 1作为它应该,但是当LN按钮后马上打,我得到的1.776的值...请注意,如果手动输入2.718,然后ln按钮被连续击中两次,我得到-.0001 ...这更接近实际的答案0.

对不起,如果这些应该是单独的职位,但我认为这两个问题都可能与常量Math.PI和Math.E的处理方式有关。有什么想法吗?

+4

显然Math.Sin不可能返回大于1的值;那应该是你的第一个线索,说明你的结尾有什么不对,而不是Math.Sin的结尾。 –

+1

虽然,有趣的是,'Math.Sin(1E50)'返回1E50 ;-) –

+1

@MatthewStrawbridge,这是完全按照文件工作:[“范围从约-9223372036854775295到约9223372036854775295的可接受值。对于超出此范围的值,Sin方法返回一个未更改,而不是抛出异常。“](http://msdn.microsoft.com/en-us/library/system.math.sin.aspx) – svick

回答

9

检查你的指数。当我在VS 2010调试评估器中评估Math.Sin(Math.Pi)时,我看到:0.00000000000000012246063538223773

这将会输出为1.224e-16。

无论哪种方式,它只是从零开始的头发宽度。与许多浮点运算一样,足够接近应被视为零。

+2

完美!谢谢。我怀疑这是一个舍入错误。我的屏幕没有运行足够长的时间来显示e-16部分。经验教训。:) – amdilley

6

Math.Sin(Math.PI) => 1.2246063538223773e-16这是相当多的0,而不是1.224

我怀疑这同样适用于你的Log(e)代码。

1

Math.Sin(Math.PI)= 1.224 ...,而不是0,因为它应该

它实际上不是1.224而是1.22460635382238E-16这几乎是但不完全为零。