我实际上有一个以上的问题。
首先,c ++中的float和double类型的最小值和最大值是什么?我已阅读本网站和cplusplus.com的答案,其中一人告诉我使用" FLT_MIN"和" FLT_MAX"浮动的值。每当我这样做时,codeblocks告诉我它(最大值:3.40282e + 038),(min:1.17549e-038)。我真的不知道这是什么意思,所以我试图获得真正的价值,并且最大值我得到了47.2498237715而且我得到了-34.8045265148。但这些价值意味着什么?
以下是我的代码片段 - 我对c ++很新。
char c; // reserve: 1 byte, store 1 character (-128 to 127)
int i; // reserve: 4 bytes, store -2147483648 to 2147483657
short int s; // reserve: 2 bytes, store -32768 to 32767
float f; // reserve: 4 bytes, store ?? - ?? (? digits)
double d; // reserve: 8 bytes, store ?? - ?? (? digits)
unsigned int u; //reserve: r bytes store 0 to 4294967295
c = 'c';
cout << c <<" lives at " << &c <<endl;
i = 40000;
cout << i <<" lives at " << &i <<endl;
s = 100;
cout << s <<" lives at " << &s <<endl;
f = 10.1;
cout << f <<" lives at " << &f <<endl;
d = 10.102;
cout << d <<" lives at " << &d <<endl;
u = 1723;
cout << u <<" lives at " << &u <<endl;
}
在代码片段中,我们可以清楚地看到short int的min-max值,例如-32768 - 32767.这些是正确可理解的值,但对于float和int,有什么实际值。
其次,两者之间是否存在重大差异。是一个优先于另一个。
最后,当我运行该程序时,我注意到char变量&#39; c&#39;没有真正的地址。这是什么意思?
在此先感谢,非常感谢任何帮助。
答案 0 :(得分:1)
全部都可以在numeric_limits中找到。
但 BEWARE
由于某些我不知道的原因,std::numeric_limits<float>:min()
没有返回最小浮点数。相反,它返回以标准化形式表示的最小正浮点数。要获得最低要求,请使用std::numeric_limits<float>::lowest()
。我没骗你。同样,对于其他浮点类型,即double
和long double
。
答案 1 :(得分:1)
std::numerics_limits
标题中的<limits>
类提供有关数字类型特征的信息。
对于浮点类型T
,这里是类型中可表示的最大值和最小值,在“最大”和“最小”的各种意义上。我还包括常见IEEE 754 64的值位二进制类型,在此答案中称为double
。这些顺序递减:
std::numeric_limits<T>::infinity()
支持无穷大,则 T
是最大的可表示值。当然,这是无限的。 T
表示std::numeric_limits<T>::has_infinity
类型是否支持无穷大。
std::numeric_limits<T>::max()
是最大的有限值。对于double
,这是2 1024 -2 971 ,大约1.79769•10 308 。
std::numeric_limits<T>::min()
是最小正正常值。浮点格式通常具有指数不能变小的间隔,但允许有效数(数字的小数部分)变小,直到达到零。这是以牺牲精度为代价的,但具有一些理想的数学计算属性。 min()
是精确度损失开始的点。对于double
,这是2 -1022 ,大约2.22507•10 -308 。
std::numeric_limits<T>::denorm_min()
是最小的正值。在具有次正规值的类型中,它是次正规的。否则,它等于std::numeric_limits<T>::min()
。对于double
,这是2 -1074 ,大约4.94066•10 -324 。
std::numeric_limits<T>::lowest()
是有限值最小的。它通常是一个数量级的负数。对于double
,这是 - (2 1024 -2 971 ),大约-1.79769•10 308 。
如果std::numeric_limits<T>::has_infinity
和std::numeric_limits<T>::is_signed
为真,则-std::numeric_limits<T>::infinity()
的值最小。当然,它是负无穷大。
您可能感兴趣的另一个特征是:
std::numeric_limits<T>::digits10
是最大的十进制数字,例如将任意十进制数转换为T
,然后转换回相同的十进制数字将产生原始数字。对于double
,这是15。答案 2 :(得分:1)
好的。使用我从这里学到的东西(感谢所有人)和网络的其他部分,我写了两个简洁的总结,只是因为我遇到了另一个问题。
在C ++中,有两种表示/存储小数值的方法。
-179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000000000双人最低
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000000000双人最大
Float的精度允许它存储最多9位数的值(7个实数,从小数到二进制转换+2)
Double,顾名思义可以存储两倍于presciosn ass的浮动。它最多可存储17位数字。 (15位实数,+2从十进制到二进制转换)
e.g。
float x = 1.426;
double y = 8.739437;
由于浮点数能够携带7 实际小数,并且双重能够携带15 实际小数,因此在执行caluclations时,将它们打印出来,正确必须使用方法。
e.g
typedef std::numeric_limits<double> dbl;
cout.precision(dbl::max_digits10-2); // sets the precision to the *proper* amount of digits.
cout << dbl::max_digits10 <<endl; // prints 17.
double x = 12345678.312;
double a = 12345678.244;
// these calculations won't perform correctly be printed correctly without setting the precision.
cout << endl << x+a <<endl;
示例2:
typedef std::numeric_limits< float> flt;
cout.precision(flt::max_digits10-2);
cout << flt::max_digits10 <<endl;
float x = 54.122111;
float a = 11.323111;
cout << endl << x+a <<endl; /* without setting precison this outputs a different value, as well as making sure we're *limited* to 7 digits. If we were to enter another digit before the decimal point, the digits on the right would be one less, as there can only be 7. Doubles work in the same way */
这种描述大致有多准确?是否可以在进行时用作标准?
答案 3 :(得分:0)
在C ++中,您可以使用std::numeric_limits
类来获取此类信息。
如果has_infinity
为true
(现在基本上适用于任何平台),那么您可以使用infinity
获取大于或等于所有其他值的值(除了NaNs)。它的否定将给出负无穷大,并且小于或等于所有其他值(NaNs除外)。
如果你想要有限值,那么你可以使用max
,它将大于或等于所有其他有限值,lowest
,它小于或等于所有其他有限值
有些令人困惑的是,min
实际上为您提供了最小的正标准化值,这与整数类型的结果完全不同步(感谢@JiveDadson指出这一点)。