簡體   English   中英

如何設置log10(0)的返回值?

[英]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)

  • 如果foofloat則返回值始終為-HUGE_VALF
  • 如果foodouble -HUGE_VAL則返回值始終為-HUGE_VAL
  • 如果foolong double則返回值始終為-HUGE_VALL

在支持浮點無窮大的實現上,這些宏總是分別擴展到floatdoublelong 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.

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