C / C ++中的最小双精度值

在C(++)程序中是否有标准和/或可移植的方式来表示最小的负值(例如使用负无穷大)?

float.h中的DBL_MIN是最小的数。

ANSI C中的 -DBL_MAX ,在float.h中定义。

浮点数(IEEE 754)是对称的,所以如果你能表示最大值( DBL_MAX或者numeric_limits<double>::max() ),只需要在前面加一个减号。

然后是很酷的方式:

 double f; (*((long long*)&f))= ~(1LL<<52); 

尝试这个:

 -1 * numeric_limits<double>::max() 

参考: numeric_limits

该类专门针对每种基本types,其成员返回或设置为不同的值,以定义在编译的特定平台中键入的属性。

在C中使用

 #include <float.h> const double lowest_double = -DBL_MAX; 

在C ++之前的版本中,使用

 #include <limits> const double lowest_double = -std::numeric_limits<double>::max(); 

在C ++ 11及以后,使用

 #include <limits> constexpr double lowest_double = std::numeric_limits<double>::lowest(); 

你在寻找实际的无限还是最小的有限值? 如果前者使用

 -numeric_limits<double>::infinity() 

这只有在

 numeric_limits<double>::has_infinity 

否则,你应该使用

 numeric_limits<double>::lowest() 

这是在C ++ 11中引入的。

如果lowest()不可用,您可以回退到

 -numeric_limits<double>::max() 

原则上可能与lowest()不同,但实际上通常不会。

 - std::numeric_limits<double>::max() 

应该工作得很好

数字限制

一个真正的便携式C ++解决scheme

从C ++ 11开始,你可以使用numeric_limits<double>::lowest() 。 根据标准,它返回到你正在寻找的东西:

一个有限的值x,使得在y < x没有其他有限的值y。
有意义的是所有的专业化都是is_bounded != false

在线演示


很多不可移植的C ++答案在这里!

有很多答案去-std::numeric_limits<double>::max()

幸运的是,在大多数情况下,它们都能很好地工作。 浮点编码scheme使用尾数和指数来分解数字,其中大多数(例如stream行的IEEE-754 )使用不同的符号位,这不属于尾数。 这允许通过翻转符号来转换最小的负值中的最大正值:

在这里输入图像说明

为什么这些便携式?

该标准没有强制任何浮点标准。

我同意我的观点有一点理论上的意思,但是假设一些偏心的编译器制造商会使用一个革命性的编码scheme,并且在一个二进制补码的一些变体中编码一个尾数。 二进制补码编码不对称。 例如对于一个有符号的8位字符,最大正数是127,但最小负数是-128。 所以我们可以想象一些浮点编码performance出类似的不对称行为。

我不知道这样的编码scheme,但重要的是, 标准并不能保证符号翻转产生预期的结果 。 所以这个受欢迎的答案(抱歉的家伙!)不能被认为是完全便携的标准解决scheme! / *至less不是如果你没有断言numeric_limits<double>::is_iec559是真的* /

原来的问题涉及无穷大。 那么,为什么不使用

 #define Infinity ((double)(42 / 0.0)) 

根据IEEE的定义? 你当然可以否定这一点。