none
三角函數問題 RRS feed

  • 問題

  •  

    為什麼

    Math.Cos(90 * Math.PI / 180)

    是等於 6.12303176911189E-17

    cos 90度不是0嗎

     

    Math.Tan(90* Math.PI) / 180)

    等於 1.63317787283838E+16

    ..

    但 cos 60 計出來是0.5

    ?

    為什麼90度就出現錯誤數值

    2007年10月30日 上午 08:06

解答

  • TextBox1.Text = string.Format("{0:0.000}", Math.Cos(Math.PI*90.0/180.0));

    數值表示法的問題....用科學記號會讓你搞胡塗...!

     

    2007年10月30日 上午 08:40

所有回覆

  • TextBox1.Text = string.Format("{0:0.000}", Math.Cos(Math.PI*90.0/180.0));

    數值表示法的問題....用科學記號會讓你搞胡塗...!

     

    2007年10月30日 上午 08:40
  • 原來如今

     

    明白了

     

    thx!

     

    2007年10月30日 上午 08:44
  • 其實以前我也被科學記號給唬了....@@

     

     

    2007年10月30日 上午 10:22
  • ...

     

    我覺得這是計算機概論沒念好,這是浮點數的基本理論,先把 IEEE 754 裡面定義的 浮點數 弄清楚,才會知道為啥要用 Format 來簡單解決。

     

    更細的作法是做相對精度的判斷,如果你的程式碼涉及一些數值模式計算,或是微積分模擬,純粹用 Format 是有問題的,而是針對值域做相對精度判斷才是正確的。

     

    簡單的說這是浮點數的計算誤差,所以沒有傳回 0 與正無限大。

     

    .Net 線上手冊上面的相關說明:

    ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.VisualStudio.v80.cht/dv_vbalr/html/90040d67-b630-4125-a6ae-37195b079042.htm

    程式碼區塊

    浮點運算式不會比較為相等

    當您處理浮點數值 (Floating-Point Number) (字串資料型別 (Visual Basic)Double 資料型別 (Visual Basic)) 時,請記得它們會當做二進位分數儲存。這表示它們無法保留任何非二進位分數 (形式為 k / (2 ^ n,其中 kn 為整數) 之數量的確切表示。例如,0.5 (= 1/2) 和 0.3125 (= 5/16) 可以當做精確值保留,而 0.2 (= 1/5) 和 0.3 (= 3/10) 則只可為近似值。

    因為這樣的不精確狀況,因此您在處理浮點數值時無法依賴確切結果。特別是理論上相等的兩個值可能會有稍微不同的表示方式。

    若要比較浮點數量

    1. System 命名空間中使用 Math 類別的 Abs 方法,計算差異的絕對值。

    2. 判斷可接受的最大差異,如果差異不大的話,您可以實際上將兩個數量視為相等。

    3. 比較差異的絕對值與可接受的差異。

    下列範例是兩個 Double 值的不當與適當比較。

     

     

    ms-help://MS.MSDNQTR.v80.cht/MS.MSDN.v80/MS.NETDEVFX.v20.cht/cpref7/html/T_System_Double.htm

    程式碼區塊

    使用浮點數值

    當執行二進位運算時,如果其中一個運算元為 Double,則其他的運算元必須為整數型別或浮點數型別 (DoubleSingle)。在執行運算之前,如果其他運算元不是 Double,它會轉換為 Double,並且該作業的執行至少會使用 Double 範圍和精確度。如果該運算產生數值結果,結果的型別為 Double

    ...

    請記住,浮點數值只能近似一個十進位數值,而精確度則決定了該數值與十進位數值近似的程度。根據預設,Double 值只含有 15 個十進位位數的精確度,不過內部維持的最大精確度是 17 位數。浮點數值的精確度會造成數種結果:

    • 兩個看起來相等的浮點數值進行比較時可能並不相等,因為它們的最小有效位數不同。

    • 使用浮點數值來進行的數學或比較作業,與使用十進位數值的結果可能會大不相同,因為浮點數值可能無法與十進位數值完全相近。

    • 當牽涉到浮點數值時,數值即可能無法進行往返作業。當一項作業將原始的浮點數值轉換為另一種形式,接著一項反向作業將此轉換後的形式再轉換回浮點數值,我們稱此數值做了一次往返,而最後的浮點數值應該等於原始的浮點數值。往返可能會失敗,因為在轉換中可能會遺失一個或多個最小有效位數。

     

     

    2007年10月30日 下午 03:02
    版主
  •  

    受教了

     

    原來數字運算也大有學問

     

     

    2007年10月30日 下午 03:10