2016-01-08 430 views
4

我试图找到最小值(最接近零),我可以存储在一个单精度浮点数中。使用<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; 
} 

正如我所料,“一个”给出无穷大,但“b”的甚至2^23除以最小值之后持续保持良好的结果,它给出0.

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

+5

你在考虑反常规吗? –

+2

您需要将FLOAT_MIN乘以FLOAT_EPSILON才能获得最小的正浮点数。否则,只需使用FLOAT_MIN,就会得到最小的正常正浮点数。 –

+0

@void_ptr我不知道,但他们似乎是答案 – Msegade

回答

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 
+0

返回最低数字(最负)但不是最小(最接近零) – Msegade

+0

谢谢Msegade指出这一点;我太急躁了,我没有仔细阅读这个问题!我编辑了我的回答,以正确回答问题。 – waleed

0

我试图找到最小值(接近零),我可以 店单精度浮点数

0是您可以存储在任何精度浮点数中的最接近0的值。实际上,您可以通过两种方式来存储它,因为存在正数和负数0.

5

std::numeric_limits::min对于浮点类型给出了可以表示的最小非零值,而不会损失精度。 std::numeric_limits::lowest给出了最小的可表示值。用IEEE表示是低于正常值值(以前称为非规格化)。

+0

@BrettHale - 谢谢你的收获!固定。 –

相关问题