繁体   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