[英]How to set returned value of log10(0)?
代碼:
#include <iostream>
#include <math.h>
using namespace std;
int main ()
{
double result = log10(0.0);
cout << result;
}
當我在 C++ 中執行 log10(0) 時,它會打印給我-inf
。
它是否適用於我將使用的每個庫/編譯器?
或者它可以在不同的平台上改變嗎?
你將如何管理pole error
保持double
?
根據cplusplus ,這取決於您從log10(0)
獲得的庫。 但是,通常未定義log10(0)
的值log10(0)
如果您願意,可以是-inf
,但它不是實數)。 通常,您應該在它們發生之前阻止這種未定義的結果(在未定義行為的 C++ 意義上不是未定義,而是在數學意義上)。 例如
double x;
x = foo();
if ( x <= 0 ) {
/* handle this case extra */
else {
y = log10(x);
}
您在log10(0)
情況下使用的值在很大程度上取決於您的應用程序。 但是,我認為在進行計算之前檢查0
更容易,而不是依賴log10(0)
返回某個特定值(因為它可能是-inf
或完全不同的值)。
對於符合 IEC 60559 標准的浮點實現, log10
的行為非常明確:
- 如果參數為 ±0,則返回 -∞ 並引發
FE_DIVBYZERO
。- 如果參數為 1,則返回 +0
- 如果參數為負,則返回 NaN 並
FE_INVALID
。- 如果參數是 +∞,則返回 +∞
- 如果參數是 NaN,則返回 NaN
此列表將允許您有條件地處理符合要求的實現的每個案例。 但老實說,我們知道只支持范圍 (+0, +∞),因此無論您的實現是否合規,您都可以簡單地使用if
-block 保護您的log10
。
一個偉大的方式來寫這個if
嵌段是isnormal
,如果你不希望允許非正規數或isfinite
如果你想支持非規格化。 例如,給定一個浮點變量foo
:
if(isfinite(foo) && foo > 0) {
cout << log10(foo) << endl;
} else {
cout << "foo is invalid\n";
}
但是您的問題的答案是否定的 -∞ 不會總是返回。 但 C++ 確實保證返回: 鑒於log10(foo)
:
foo
是float
則返回值始終為-HUGE_VALF
foo
是double
-HUGE_VAL
則返回值始終為-HUGE_VAL
foo
是long double
則返回值始終為-HUGE_VALL
在支持浮點無窮大的實現上,這些宏總是分別擴展到
float
、double
和long double
的正無窮大[來源]
無論您的實現是否支持無窮大或這些值是否擴展到最大浮點值,處理此問題的正確方法仍然可能isnormal
isfinite
/ isfinite
但您也可以測試log10
的返回:
const auto result = log10(foo);
if(is_same_v<decltype(foo), float> && result == -HUGE_VALF ||
is_same_v<decltype(foo), double> && result == -HUGE_VAL ||
is_same_v<decltype(foo), long double> && result = -HUGE_VALL) {
cout << "foo is invalid\n";
} else {
cout << result << endl;
}
那么 c++ ref 給出了明確的答案: cpp ref 。
如果參數為 ±0,則返回 -∞ 並引發 FE_DIVBYZERO。
所以是的,log10(0) 會給你 -inf,不管你使用什么庫/編譯器(只要它符合規范)。
在數學中沒有計算log(0)
選項
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.