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