最小浮点数(最接近零)

时间:2016-01-08 01:04:26

标签: c++ gcc floating-point

我正在尝试找到可以存储在单个精确浮点数中的最小值(最接近零)。使用<limits>标题我可以获得值,但是如果我将它设置得更小,浮动仍然可以保持它并且它给出了正确的结果。这是一个用g ++ 5.3.0编译的测试程序。

#include <limits>
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    float a = numeric_limits<float>::max();    
    float b = numeric_limits<float>::min(); 

    a = a*2;
    b = b/pow(2,23);


    cout << a << endl;
    cout << b << endl;
}

正如我所预料的那样,“a”给出了无穷大,但是“b”在将最小值除以2 ^ 23之后仍保持良好的结果,之后它给出了0.

给出numeric_limits<float>::min()的值是2 ^( - 126),我相信这是正确的答案,但为什么我的程序上的浮点数保持这么小的数字?

3 个答案:

答案 0 :(得分:6)

对于浮点类型,

std::numeric_limits::min给出了可以在不损失精度的情况下表示的最小非零值。 std::numeric_limits::lowest给出最小的可表示值。使用IEEE表示的次正常值(以前称为非正规化)。

答案 1 :(得分:3)

来自维基百科https://en.wikipedia.org/wiki/Single-precision_floating-point_format

  

最小正正常值是2 ^-126≈1.18×10 ^ -38和   最小正(非正规)值为2 ^-149≈1.4×10 ^ -45。

所以,对于

cout  << (float)pow(2,-149) 
      << "-->" << (float)pow(2,-150) 
      << "-->" <<  (float)pow(2,-151) << endl;

我得到了:

1.4013e-45-->0-->0

答案 2 :(得分:0)

  

我正试图找到最小值(最接近零)   存储在单个精确浮点数

0是最接近0的值,可以存储在任何精度浮点数中。事实上,你可以用两种方式存储它,因为它有正负0。