我正在尝试找到可以存储在单个精确浮点数中的最小值(最接近零)。使用<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),我相信这是正确的答案,但为什么我的程序上的浮点数保持这么小的数字?
答案 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。