【发布时间】:2016-01-08 01:04:26
【问题描述】:
我正在尝试找到可以存储在单个精度浮点数中的最小值(最接近于零)。使用 <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),我相信这是正确的答案,但为什么我的程序中的浮点数持有这么少的数字?
【问题讨论】:
-
你在考虑非正规化吗?
-
您需要将 FLOAT_MIN 乘以 FLOAT_EPSILON 以获得最小的正浮点数。否则,仅使用 FLOAT_MIN,您将获得最小的正常正浮点数。
-
@void_ptr 我不知道,但他们似乎是答案
-
试试
nextafter (0.0f, 1.0f)。这将找到下一个可表示的浮点数,从零开始并朝着统一的方向前进。 -
既然你想要一个
float结果,使用nextafterf (0.0f, 1.0f)[注意在函数名称中尾随f] 可能会更好,虽然我的印象是nexafter被正确地重载为'浮动'和'双'。
标签: c++ gcc floating-point