簡體   English   中英

C 浮點異常處理

[英]C floating point exception handling

fenv.h的手冊頁( feraiseexcept及其同類)非常缺乏信息。 我在網上找到的示例(cppreference.com 等)非常少。

它們應該如何使用? 特別是, feraiseexcept(...)總是返回嗎? 應該從獲得非法參數的 function 返回什么,例如sqrt(-1) 我假設NAN

是否應該在 function 中獲取並恢復原始 state? 例如,一個人可能會為某個迭代算法計算一個起點,如果該計算結果不准確並沒有任何后果,那么迭代可以收斂到全精度。

在調用例如庫函數的程序中應該如何使用它?

(我寧願不必深入研究隨機數學庫資源來回答上述問題。)

fenv.hferaisexceptionand [its] ilk )的手冊頁非常缺乏信息,我在網上找到的示例(cppreference.com 等)非常少。

<fenv.h>C 標准指定。 Unix 手冊頁僅在擴展 C 規范時才有用。 對 cppreference.com 持懷疑態度; 已知有錯誤。

它們應該如何使用?

討論所有<fenv.h>對於 Stack Overflow 來說是一個過於寬泛的問題。

特別是, feraisexception(...)總是返回嗎?

根據 C 2018 7.6.2.3 2 和 foonote 221, feraiseexcept嘗試導致浮點異常,就好像它們是由算術指令生成的一樣。 因此,如果它引發一個啟用了陷阱的異常,它將導致一個陷阱。

相反, fesetexceptflag僅設置浮點異常標志,而不會生成實際異常。 根據 7.6.2.4 2,“……此 function 不會引發浮點異常,而只會設置標志的 state。”

應該從獲得非法參數的 function 返回什么,例如sqrt(-1) 我假設NAN

這在<fenv.h>的域之外。 sqrt在 7.12 中指定,涵蓋<math.h> 根據 7.12.7.5 2,如果參數小於零,則會發生sqrt域錯誤。 根據 7.12.1, 2,“……在域錯誤中,function 返回實現定義的值……”並且它還可能設置errno和/或引發“無效”浮點異常。 通常,實現將返回安靜的 NaN。

是否應該在 function 中獲取並恢復原始 state?

這取決於指定或實施 function 的人。 提供“基本”數學函數的例程,對於標准數學庫,可能需要影響浮點 state,僅在提供的理想 function 所要求的情況下,隱藏任何內部操作。 例如,如果log10(100)是通過使用工程多項式來逼近對數來實現的,那么多項式的評估可能會使用具有非常高的精度和准確度的算術運算,以至於最終結果在四舍五入到最終格式時, 正好是兩個。 但是中間計算可能涉及一些不精確的操作。 因此,將引發不精確的異常。 如果例程僅計算多項式並返回准確的結果 2,它將引發不准確標志。 理想情況下,例程將抑制浮點陷阱、保存異常標志、進行計算、恢復最初啟用的陷阱、設置適當的異常標志(如果有)並返回結果。 (或者,可以實現例程以僅使用 integer 算法,避免浮點問題。)

在專門的庫例程之外,浮點子例程很少 go 到這種程度。 取決於每個應用程序希望其例程如何運行。

例如,一個人可能會為某個迭代算法計算一個起點,如果該計算結果不准確是不連續的,因為迭代可能會收斂到全精度。

這一段不清楚,可能不合語法。 我無法按書面方式回答。

在調用例如庫函數的程序中應該如何使用它?

這個問題不清楚,可能是因為前一段不夠清晰。 “這”的來歷不明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM