2012-01-25 45 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這幾乎是但不完全爲零。