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的定义? 你当然可以否定这一点。