float和double的实际最小/最大值是什么(C ++)

时间:2018-02-05 19:31:11

标签: c++ variables floating-point double

我实际上有一个以上的问题。

首先,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;没有真正的地址。这是什么意思?

在此先感谢,非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

全部都可以在numeric_limits中找到。

BEWARE

由于某些我不知道的原因,std::numeric_limits<float>:min()没有返回最小浮点数。相反,它返回以标准化形式表示的最小正浮点数。要获得最低要求,请使用std::numeric_limits<float>::lowest()。我没骗你。同样,对于其他浮点类型,即doublelong double

http://en.cppreference.com/w/cpp/types/numeric_limits

答案 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_infinitystd::numeric_limits<T>::is_signed为真,则-std::numeric_limits<T>::infinity()的值最小。当然,它是负无穷大。

您可能感兴趣的另一个特征是:

  • std::numeric_limits<T>::digits10是最大的十进制数字,例如将任意十进制数转换为T,然后转换回相同的十进制数字将产生原始数字。对于double,这是15。

答案 2 :(得分:1)

好的。使用我从这里学到的东西(感谢所有人)和网络的其他部分,我写了两个简洁的总结,只是因为我遇到了另一个问题。

在C ++中,有两种表示/存储小数值的方法。

浮动和双打

浮点数可以存储来自:

的值
  • -340282346638528859811704183484516925440.0000000000000000 Float low
  • 340282346638528859811704183484516925440.0000000000000000 Float max

double可以存储以下值:

  • -179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000000000双人最低

  • 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.0000000000000000双人最大

Float的精度允许它存储最多9位数的值(7个实数,从小数到二进制转换+2)

Double,顾名思义可以存储两倍于presciosn ass的浮动。它最多可存储17位数字。 (15位实数,+2从十进制到二进制转换)

e.g。

     float x = 1.426;
     double y = 8.739437;

小数&amp;数学

由于浮点数能够携带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_infinitytrue(现在基本上适用于任何平台),那么您可以使用infinity获取大于或等于所有其他值的值(除了NaNs)。它的否定将给出负无穷大,并且小于或等于所有其他值(NaNs除外)。

如果你想要有限值,那么你可以使用max,它将大于或等于所有其他有限值,lowest,它小于或等于所有其他有限值

有些令人困惑的是,min实际上为您提供了最小的正标准化值,这与整数类型的结果完全不同步(感谢@JiveDadson指出这一点)。