最小/最大整数和双精度

时间:2017-01-05 08:44:01

标签: c++ floating-point limit

我尝试了以下代码

#include <iostream>
#include <limits>
using namespace std;
cout << numeric_limits<int>::min() << endl;
cout << numeric_limits<int>::max() << endl;
cout << numeric_limits<double>::min() << endl;
cout << numeric_limits<double>::max() << endl;

输出

-2147483648
2147483647
2.22507e-308
1.79769e+308

为什么最小双倍不是(-1)乘以最大双倍? Afaik表示整数,第一位用作符号(这可能是为什么max integer的绝对值低于min整数的绝对值,是不是?)。如何描述负双打,因为对我而言,似乎8个双字节中没有一个负责该符号。直到现在,我读到浮点数是对称的。我不太明白这一点,因为整数值也应该是对称的?!

有人可以为业余人士解释一下吗?

3 个答案:

答案 0 :(得分:3)

对于积分类型,与您的信念相反,不要求第一位代表符号。并且存在真实世界的陈述,其中绝对是不真实的。

关于积分类型可能具有不同幅度的最小值和最大值(即一个不是另一个的负值)的原因....当前编译器的典型实现选择是表示具有某些特定数量的整数类型位。可能的不同值(比特值的不同可能组合)的数量是2,增加到比特数。因此,8signed char可以表示25628)不同的值,16位int可以表示{{1不同的值,65536位int可以表示32个不同的值。请注意,所有这些值都是均匀的。其中一个可表示的值将为零,这会留下奇数个其他不同的值。这意味着值必须加倍(两个不同的位模式表示相同的值)或[实际中通常的实现选择]最大值和最小值的大小不相等。顺便提一下,这也是14294967296通常为无符号整数类型赋予奇数值的原因。

对于浮点,std::numeric_limits::max()的规范是最小的正值(具有最小幅度的正值),min()是最大的。如果希望负值从零开始最远,请使用(自C ++ 11开始)max()

答案 1 :(得分:2)

numeric_limits表现得像:

  • 对于数字:min和max是可能的值范围
  • 对于浮点数:min是可能的最小值,max是最大可能值

请参阅http://en.cppreference.com/w/cpp/types/numeric_limits/min

  

返回数值类型T表示的最小有限值。   对于具有非规范化的浮点类型,min返回最小值   正标准化值。请注意,此行为可能是意外的,   特别是与整数类型的min行为相比。至   找到没有小于它的值的值,使用   numeric_limits ::最低。 min仅对有界类型有意义   对于无界无符号类型,即表示类型的类型   无限的负值集没有任何有意义的最小值。

cout << numeric_limits<double>::lowest() << endl;

将显示您的预期(1.79769e+308

答案 2 :(得分:1)

另一个在std中混淆命名的例子。 来自http://en.cppreference.com/w/cpp/types/numeric_limits/min

  

对于具有非规范化的浮点类型,min返回最小正标准化值。