是否有标准和/或可移植的方式来表示C(++)程序中最小的负值(例如使用负无穷大)?
float.h中的DBL_MIN是最小的正号。
答案 0 :(得分:116)
-DBL_MAX
in ANSI C,在float.h中定义。
答案 1 :(得分:69)
浮点数(IEEE 754)是对称的,因此如果您可以表示最大值(DBL_MAX
或numeric_limits<double>::max()
),则只需加一个减号。
然后是很酷的方式:
double f;
(*((long long*)&f))= ~(1LL<<52);
答案 2 :(得分:37)
在C中,使用
#include <float.h>
const double lowest_double = -DBL_MAX;
在C ++ pre-11中,使用
#include <limits>
const double lowest_double = -std::numeric_limits<double>::max();
在C ++ 11及更高版本中,使用
#include <limits>
constexpr double lowest_double = std::numeric_limits<double>::lowest();
答案 3 :(得分:32)
试试这个:
-1 * numeric_limits<double>::max()
这个课程专门针对每一个 基本类型,以及它 成员返回或设置为 定义的不同值 类型中包含的属性 它的具体平台 编译。
答案 4 :(得分:20)
您在寻找实际无穷大还是最小有限值?如果是前者,请使用
-numeric_limits<double>::infinity()
仅在
时有效numeric_limits<double>::has_infinity
否则,您应该使用
numeric_limits<double>::lowest()
是在C ++ 11中引入的。
如果lowest()
不可用,您可以回退到
-numeric_limits<double>::max()
原则上可能与lowest()
不同,但通常不在实践中。
答案 5 :(得分:9)
从C ++ 11开始,您可以使用numeric_limits<double>::lowest()
。
根据标准,它会准确地返回您正在寻找的内容:
有限值x使得
的所有专业都有意义y < x
中没有其他有限值y。
对于is_bounded != false
。
-std::numeric_limits<double>::max()
有很多答案。
幸运的是,它们在大多数情况下都能很好地运作。浮点编码方案在尾数和指数中分解数字,并且它们中的大多数(例如,流行的IEEE-754)使用不属于尾数的不同符号位。这允许通过翻转符号来转换最小负数中的最大正数:
标准没有强加任何浮点标准。
我同意我的论点有点理论,但是假设某个偏心编译器制造商会使用革命性的编码方案,其尾数编码为two's complement的某些变体。二进制补码编码不对称。例如,对于带符号的8位字符,最大正数为127,但最小负数为-128。所以我们可以想象一些浮点编码显示类似的不对称行为。
我不知道有这样的编码方案,但重点是标准并不能保证符号翻转产生预期的结果。所以这个受欢迎的答案(对不起家伙!)不能被视为完全便携的标准解决方案! / *至少不是,如果你没有断言numeric_limits<double>::is_iec559
是真的* /
答案 6 :(得分:7)
答案 7 :(得分:1)
最初的问题涉及无限。 那么,为什么不使用
#define Infinity ((double)(42 / 0.0))
根据IEEE的定义? 你当然可以否定这一点。
答案 8 :(得分:1)
在C(++)程序中是否存在表示最小负值(例如,使用负无穷大)的标准和/或便携式方法?
C方法。
许多实现都支持+/-无限,因此double
的最大负值是-INFINITY
。
#include <math.h>
double most_negative = -INFINITY;
是否有标准和/或可移植的方式... ??
现在我们还需要考虑其他情况:
简单地-DBL_MAX
。
我希望在这种情况下,OP会更喜欢-DBL_MAX
。
DBL_MAX
。这是一个不寻常的情况,可能超出了OP的关注范围。当double
被编码为一对浮点以实现所需的范围/进动时,(请参见double-double)存在最大的 normal { {1}},也许还有一个更大的反常。我见过一个辩论,就是double
是否应指两者中最大的 normal 。
幸运的是,这种配对方法通常包含-infinity,因此,最大负值仍为DBL_MAX
。
为实现更高的可移植性,代码可以沿线运行
-INFINITY
答案 9 :(得分:0)
如果您没有启用浮动异常(您不应恕我直言),则可以简单地说:
double neg_inf = -1/0.0;
这将产生负无穷大。如果需要浮动,则可以强制转换结果
float neg_inf = (float)-1/0.0;
或使用单精度算术
float neg_inf = -1.0f/0.0f;
结果始终是相同的,单精度和双精度中都有一个负无穷大的表示形式,并且它们可以按照您的期望相互转换。