gcc 最小(正)浮点数(最接近零)

zd287kbt  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(155)

我试图找到我可以存储在单个precission浮点数中的最小(正)值(最接近零)。使用<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),我相信这是正确的答案,但为什么我的内存中的浮点数是如此之小?

eblbsuwk

eblbsuwk1#

浮点类型的std::numeric_limits::min给出了可以在不损失精度的情况下表示的最小非零值。std::numeric_limits::lowest给出了最小的可表示值。对于IEEE表示,这是一个次正常值(以前称为非正常值)。

l7mqbcuq

l7mqbcuq2#

维基百科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

iszxjhcz

iszxjhcz3#

我试图找到最小值(最接近零),我可以存储在一个单一的精度浮点数
0是可以存储在任何精度浮点数中的最接近0的值。实际上,可以以两种方式存储它,因为有正0和负0。
编辑:我编辑了这个问题,以指定积极的,但这是正确的答案,什么是最初提出的。

相关问题