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

时间:2009-07-20 13:23:51

标签: c++ c math

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

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

10 个答案:

答案 0 :(得分:116)

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

答案 1 :(得分:69)

浮点数(IEEE 754)是对称的,因此如果您可以表示最大值(DBL_MAXnumeric_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()

参考:numeric_limits

  

这个课程专门针对每一个   基本类型,以及它   成员返回或设置为   定义的不同值   类型中包含的属性   它的具体平台   编译。

答案 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 ++解决方案

从C ++ 11开始,您可以使用numeric_limits<double>::lowest()。 根据标准,它会准确地返回您正在寻找的内容:

  

有限值x使得y < x中没有其他有限值y。   
对于is_bounded != false

的所有专业都有意义

Online demo

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

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

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

enter image description here

为什么这些不便携?

标准没有强加任何浮点标准。

我同意我的论点有点理论,但是假设某个偏心编译器制造商会使用革命性的编码方案,其尾数编码为two's complement的某些变体。二进制补码编码不对称。例如,对于带符号的8位字符,最大正数为127,但最小负数为-128。所以我们可以想象一些浮点编码显示类似的不对称行为。

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

答案 6 :(得分:7)

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

应该可以正常工作

Numeric limits

答案 7 :(得分:1)

最初的问题涉及无限。 那么,为什么不使用

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

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

答案 8 :(得分:1)

  

在C(++)程序中是否存在表示最小负值(例如,使用负无穷大)的标准和/或便携式方法?

C方法。

许多实现都支持+/-无限,因此double的最大负值是-INFINITY

#include <math.h>
double most_negative = -INFINITY;

  

是否有标准和/或可移植的方式... ??

现在我们还需要考虑其他情况:

  • 没有局限性

简单地-DBL_MAX

  • 仅一个 unsigned 无限。

我希望在这种情况下,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;

结果始终是相同的,单精度和双精度中都有一个负无穷大的表示形式,并且它们可以按照您的期望相互转换。