回答
通常,影響例程執行正弦,對數等準確度的因素是您調用的例程版本。一個好的數學庫具有用於單精度正弦(C的sinf
函數),雙精度正弦(C的sin
)和長雙正弦(C的sinl
)的單獨例程。在C中,通常通過調用sinf
,sin
或sinl
來明確調用這些版本。 C還提供<tgmath.h>
,這會導致源代碼sin(x)
擴展到特定版本,具體取決於x
的類型。在C++中,函數調用也將根據變量的類型進行解析。
在良好的數學函數庫,sinf
程序將使用更快的算法準確適合的float
精度,而sin
將使用較慢的算法適合的double
精度。數學圖書館的質量各不相同,因爲編寫這些例程是一項複雜的任務。
不使用系列擴展。 (特別是泰勒級數由於誤差分佈不好而需要使用,並且需要太多的項來收斂。)相反,使用精心準備的近似多項式。經常使用某種形式的極小極大多項式。更精確類型的例程可能使用多項式,但它也可能以其他方式進行更改,例如將域分割爲更多的間隔或使用某種形式的擴展精度。這些都不是自動的;例程由軟件引擎手動準備。
據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編譯器)的文件。
這段代碼在第一種情況下顯示'sin(d)'和'sin(f)'之間差異的原因是因爲它正在取兩個不同數字的正弦值;它們相差33,970,176。賦值'f = d;'將'd'的值轉換爲'float',從而改變它。 –
@EricPostpischil - 是的:這就是爲什麼我在兩個不同的方向完成任務。在'f = d'賦值中失去精度,但在'd = f'賦值中失去精度;所以如果你使用相同的(大)數並得到相同的答案,你知道它使用了相同的算法(它在計算之前將'f'轉換爲'double')。 – Floris
- 1. 增加滾動條高度自動
- 2. 自動增加宏擴展
- 3. 增加自動完成擴展列表的寬度
- 4. Radscheduler根據主題自動增加或擴大約會高度
- 5. div高度自動增加
- 6. GridView高度自動增加
- 7. 如何在數據增加時自動擴展寬度和高度
- 8. 是否有可能增加進度條內線的高度Android
- 9. 擴展或增加水平滾動條寬度
- 10. textarea的自動高度增加
- 11. 自動增量列值隨機變高
- 12. 增加SIFT中檢測到的特徵數量會提高精度?
- 13. 即使高度增加,滾動條也會進入Safari(0123)
- 14. C#提高文件處理的進度條精度
- 15. Silverlight ListBox高度自動增加
- 16. 自動增加高度(html,CSS)
- 17. 嵌套桌面高度自動增加?
- 18. 隨着令牌輸入列表增加,自舉輪播自動增加高度
- 19. 在WHERE子句中增加條件會提高搜索速度嗎?
- 20. 如何精確擴展mpreal的精度?
- 21. 自動擴展列
- 22. PostgreSQL自動增加競爭條件是否可能
- 23. 當div內容增加時,主容器div的高度不會動態增加
- 24. Silverlight - 帶有列表框的擴展器控件,100%高度
- 25. SQL自動擴展關係
- 26. ExpandableListView - 是否有條件擴展?
- 27. 增加高度,而不會自動佈局
- 28. 提高AI精靈的移動速度
- 29. 擴展Linenarlayout高度
- 30. 動態增加iframe高度
我不這麼認爲。 C++具有函數重載的概念,所以編譯器知道根據參數的類型調用什麼形式的函數。我不相信這個概念存在於C中。如果你用'float'調用函數,它將在執行計算之前轉換爲double。我會尋找一個參考來確認...... – Floris
@Floris'float'不會自動提升爲'double',因爲'char'和'short'會提升爲'int'。 –
自引進80387以來,三角函數是單機指令... –