2013-04-03 17 views
1

我想知道如果從浮子Ç增加機器精度自動提高在級數展開術語例如三角函數?增加機器精度是否會自動提高系列擴展的條件?

這和我關於堆棧溢出的其他問題與調查各向異性介質中波動方程的數值不穩定性有關。

+1

我不這麼認爲。 C++具有函數重載的概念,所以編譯器知道根據參數的類型調用什麼形式的函數。我不相信這個概念存在於C中。如果你用'float'調用函數,它將在執行計算之前轉換爲double。我會尋找一個參考來確認...... – Floris

+0

@Floris'float'不會自動提升爲'double',因爲'char'和'short'會提升爲'int'。 –

+0

自引進80387以來,三角函數是單機指令... –

回答

5

通常,影響例程執行正弦,對數等準確度的因素是您調用的例程版本。一個好的數學庫具有用於單精度正弦(C的sinf函數),雙精度正弦(C的sin)和長雙正弦(C的sinl)的單獨例程。在C中,通常通過調用sinf,sinsinl來明確調用這些版本。 C還提供<tgmath.h>,這會導致源代碼sin(x)擴展到特定版本,具體取決於x的類型。在C++中,函數調用也將根據變量的類型進行解析。

在良好的數學函數庫,sinf程序將使用更快的算法準確適合的float精度,而sin將使用較慢的算法適合的double精度。數學圖書館的質量各不相同,因爲編寫這些例程是一項複雜的任務。

不使用系列擴展。 (特別是泰勒級數由於誤差分佈不好而需要使用,並且需要太多的項來收斂。)相反,使用精心準備的近似多項式。經常使用某種形式的極小極大多項式。更精確類型的例程可能使用多項式,但它也可能以其他方式進行更改,例如將域分割爲更多的間隔或使用某種形式的擴展精度。這些都不是自動的;例程由軟件引擎手動準備。

0

this reference,同時也有不同版本的sin(x)功能C++的,

在C,僅此功能的雙版本,使用該名稱

的存在是爲了證實這一點,我寫了以下幾行代碼:

#include <stdio.h> 
#include <math.h> 

int main(void){ 

    double d = 0.12345e16; 
    float f; 
    f = d; 

    printf("the difference is %f\n", sin(d) - sin(f)); 

    f = 0.12345e16; 
    d = f; 
    printf("the difference is now %f\n", sin(d) - sin(f)); 

} 

這產生了以下輸出(當用C編譯時編譯器):

the difference is 1.947785 
the difference is now 0.000000 

編輯 - 在我原來的代碼有一個錯字。現在更新,並給出預期的結果。

以上顯示兩個參數的評估方式相同,確認使用相同的算法。

這是在Linux上使用gcc編譯器,使用-lm選項,使用名爲fltchk.c(我相信應該導致gcc使用C編譯器)的文件。

+1

這段代碼在第一種情況下顯示'sin(d)'和'sin(f)'之間差異的原因是因爲它正在取兩個不同數字的正弦值;它們相差33,970,176。賦值'f = d;'將'd'的值轉換爲'float',從而改變它。 –

+0

@EricPostpischil - 是的:這就是爲什麼我在兩個不同的方向完成任務。在'f = d'賦值中失去精度,但在'd = f'賦值中失去精度;所以如果你使用相同的(大)數並得到相同的答案,你知道它使用了相同的算法(它在計算之前將'f'轉換爲'double')。 – Floris