C++ STD的INF是否与一般无穷大的行为完全一致

C++ STD的INF是否与一般无穷大的行为完全一致,c++,overflow,std,infinity,C++,Overflow,Std,Infinity,我正在实现一个相当复杂的数值算法。 它包含一些指数,在打印中间结果时,我发现其中有一些double溢出。 然而,终端打印的是inf而不是inf或NaN,而且它似乎不是一个双精度,甚至不是最小或最大可表达双精度。 但inf的行为似乎就好像它是扩展实数系统,从这个角度来看,正无穷大和负无穷大都被视为一个实数,而不是涉及极限的语句的缩写 我已经做了一个测试:g++版本:Apple LLVM版本8.0.0-800.0.42.1 #include <iostream> // cout #inc

我正在实现一个相当复杂的数值算法。 它包含一些指数,在打印中间结果时,我发现其中有一些double溢出。 然而,终端打印的是inf而不是inf或NaN,而且它似乎不是一个双精度,甚至不是最小或最大可表达双精度。 但inf的行为似乎就好像它是扩展实数系统,从这个角度来看,正无穷大和负无穷大都被视为一个实数,而不是涉及极限的语句的缩写

我已经做了一个测试:g++版本:Apple LLVM版本8.0.0-800.0.42.1

#include <iostream> // cout
#include <cmath> // exp, log
#include <limits> // data ranges

int main(void)
{
   const double dMin =std::numeric_limits<int>::min();
   const double dMax =std::numeric_limits<int>::max();
   double p1 =std::exp(710);
   double p2 =std::exp(750);
   double p3 =std::exp(800);
   double p4 =-std::log(0.0);
   std::cout << "p1 :=std::exp(710) =" << p1 << '\n';
   std::cout << "p2 :=std::exp(750) =" << p2 << '\n';
   std::cout << "p3 :=std::exp(800) =" << p3 << '\n';
   std::cout << "p4 :=-std::log(0.0) =" << p4 << '\n';
   std::cout << "does p1==dMax? " << ( (p1==dMax) ? "yes" : "no" ) << '\n';
   std::cout << "does p1==-dMin? " << ( (p1==-dMin) ? "yes" : "no" ) << '\n';
   std::cout << "does p1==p2? " << ( (p1==p2) ? "yes" : "no" ) << '\n';
   std::cout << "does p2==p3? " << ( (p2==p3) ? "yes" : "no" ) << '\n';
   std::cout << "does p3==p4? " << ( (p3==p4) ? "yes" : "no" ) << '\n';
   std::cout << "does 3*p1==p2/2+1? " << ( (3*p1==p2/2+1) ? "yes" : "no" ) << '\n';
   std::cout << "does (-p1)*(-p2)==p3*p3*p3? " << ( ((-p1)*(-p2)==p3*p3*p3) ? "yes" : "no" ) << '\n';
   std::cout << "does std::log(p2)==std::exp(p3)? " << ( (std::log(p2)==std::exp(p3)) ? "yes" : "no" ) << '\n';
}
似乎inf确实类似于我们的无限概念,但不等于std的最大值和最小值

那么,假设inf以与普通感官无限相同的方式工作,安全吗? 我可以依赖于算法中间步骤中的操作吗?它涉及inf,将其视为真无穷大,最后只处理其结果?
如果没有,我应该抓住它吗?但既然不是最大值或最小值,我怎么能这样做呢

将此答案限制为IEEE754浮点,+Inf来自1.0/0.0之类的计算,-Inf来自-1.0/0.0之类的计算

另一种类型是从0.0/0.0产生的,不是数字

两个设置为+Inf的浮点变量将相互比较true,同上-Inf。它们表示std::numeric_limits::max的不同量。+Inf大于除自身和NaN之外的所有值

请注意,设置为NaN的两个浮点变量不会相互比较true,也不会与任何其他变量进行比较


无论如何,std::log0.0必须返回-Inf,而不是NaN。请参见

将此答案限制为IEEE754浮点,+Inf来自1.0/0.0之类的计算,-Inf来自-1.0/0.0之类的计算

另一种类型是从0.0/0.0产生的,不是数字

两个设置为+Inf的浮点变量将相互比较true,同上-Inf。它们表示std::numeric_limits::max的不同量。+Inf大于除自身和NaN之外的所有值

请注意,设置为NaN的两个浮点变量不会相互比较true,也不会与任何其他变量进行比较

无论如何,std::log0.0必须返回-Inf,而不是NaN。看

< C++ > STD的INF…< /P>

C++标准没有指定无穷大的行为的任何要求,或者无限大可以用浮点数表示。 如果您的系统使用符合特定浮点标准的浮点数,则该标准可能会指定无穷大的行为

似乎inf确实类似于我们的无限概念,但不等于std的最大值和最小值

的确如此。numeric_limits::max定义为返回最大有限值

既然它不是最大值或最小值的两倍,如何[抓住无穷大]

如果你的意思是想检查一个值是否为无穷大,你可以将其与数值极限::无穷大进行比较,或者如果你有C++11,那么std::isinf可以同时检查正无穷大和负无穷大

< C++ > STD的INF…< /P>

C++标准没有指定无穷大的行为的任何要求,或者无限大可以用浮点数表示。 如果您的系统使用符合特定浮点标准的浮点数,则该标准可能会指定无穷大的行为

似乎inf确实类似于我们的无限概念,但不等于std的最大值和最小值

的确如此。numeric_limits::max定义为返回最大有限值

既然它不是最大值或最小值的两倍,如何[抓住无穷大]


如果你的意思是想检查一个值是否为无穷大,你可以将其与数值极限::无穷大进行比较,或者如果你有C++11,那么std::isinf可以检查正无穷大和负无穷大。

正如其他答案已经提到的那样,浮点数的行为在标准中没有很好的定义,然而,它是由定义得很好的,并且大多数实现都使用它。首先要做的是检查您的实现是否有效地使用了它:

static_assert(std::numeric_limits<double>::is_iec559, "Stupid implementation!");
更好的是,IEEE-754对无穷大的行为有非常明确的规则: 1,例如-inf*-inf=+inf、+inf++inf=+inf等等。标准数学函数也有定义良好的无穷大行为,因此您也可以依赖它们

因此,如果您的实现遵循IEEE标准,是的,您可以依赖无穷大上的中间运算,只检查最终结果


1这不是一个官方资源,但据我所知,它是正确的。

正如其他答案中已经提到的那样,浮点数的行为并没有被标准很好地定义 它由定义得非常好,大多数实现都使用它。首先要做的是检查您的实现是否有效地使用了它:

static_assert(std::numeric_limits<double>::is_iec559, "Stupid implementation!");
更好的是,IEEE-754对无穷大的行为有非常明确的规则: 1,例如-inf*-inf=+inf、+inf++inf=+inf等等。标准数学函数也有定义良好的无穷大行为,因此您也可以依赖它们

因此,如果您的实现遵循IEEE标准,是的,您可以依赖无穷大上的中间运算,只检查最终结果


1这不是官方资源,但据我所知,它是正确的。

std::log0.0可能会返回-Inf;我可以发誓,它必须返回+Inf:will,稍后将挖掘出标准。从数学上讲,log0是你能遇到的最糟糕的极点之一。我检查过了,它真的是inf。为什么它是最糟糕的极点?是因为log0不能被劳伦特展开吗?我想不会,但我不知道怎么表现。-不管怎样,一个离题,对不起。@a你怎么检查的?我没有访问IEEE754标准的权限,但是说它应该返回-inf,你的实验表明它返回-inf,我自己的测试表明它返回-inf-我不明白为什么它会返回+inf.@Holt:Oops。每天学习新的东西。std::log0.0应该返回-Inf;我可以发誓,它必须返回+Inf:will,稍后将挖掘出标准。从数学上讲,log0是你能遇到的最糟糕的极点之一。我检查过了,它真的是inf。为什么它是最糟糕的极点?是因为log0不能被劳伦特展开吗?我想不会,但我不知道怎么表现。-不管怎样,一个离题,对不起。@a你怎么检查的?我没有访问IEEE754标准的权限,但是说它应该返回-inf,你的实验表明它返回-inf,我自己的测试表明它返回-inf-我不明白为什么它会返回+inf.@Holt:Oops。每天学习新的东西。常识无限,我发现现在很难控制我的笑声:我不是英语母语用户QQ^^这不是英语,只是存在感官无限的断言。好吧,正如我所说,延伸的实线。我知道x->\infty通常定义什么,我看到你是善意的XD common Sensic infinity,我现在很难控制我的笑声:我不是英语母语用户QQ^^这不是英语,只是存在感官无限的断言。好吧,正如我所说,扩展实线。我知道x->\infty通常对它的定义,我看到你是出于好意,投票赞成因果报应,而且这个答案真的相当不错——我已经记下了你的一条评论,并将其放在我的答案中。是的,我的答案是正确的。好消息。请原谅,我现在才有时间来检查这个问题。我对因果报应投了赞成票,而且这个答案真的很好——我已经记下了你的一条评论,并把它放在了我的答案中。是的,我的答案是正确的。好消息。对不起,我现在才有时间检查一下。
std::numeric_limits<double>::infinity()