【问题标题】:Minimum floating point number (closest to zero)最小浮点数(最接近零)
【发布时间】: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&lt;float&gt;::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


【解决方案1】:

std::numeric_limits::min 用于浮点类型给出可以在不损失精度的情况下表示的最小非零值。 std::numeric_limits::lowest 给出最小的可表示值。使用 subnormal 值(以前称为非规范化)的 IEEE 表示。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 返回最小数(最负数)但不是最小数(最接近零)
    • 谢谢你,Msegade 指出这一点;我有点太仓促了,我没有仔细阅读这个问题!我编辑了我的回复以正确回答手头的问题。
    【解决方案3】:

    我正在尝试找到我能找到的最小值(最接近于零) 存储在一个精度浮点数中

    0 是您可以存储在任何精度浮点数中的最接近 0 的值。其实可以有两种存储方式,有正0和负0。

    【讨论】:

    • 很明显OP的意思是最小的数大于零
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    相关资源
    最近更新 更多