c/c++语言开发共享漂浮小于FLT_MIN。 为什么FLT_TRUE_MIN?

为了看看在浮动下溢的情况下会发生什么,我发现我可以使浮点数比FLT_MIN小得多。 我在OS 10.9上使用xcode 5.1。 语言方言是gnu99。

#include  #include  #include  int main(int argc, const char * argv[]) { float underflow = FLT_MIN * 0.0000004; printf("Float min is %f or %e.nUnderflow is %f or %enMin float exp is %d.n", FLT_MIN, FLT_MIN, underflow, underflow, FLT_MIN_10_EXP); return 0; } 

打印:
浮点最小值为0.000000或1.175494e-38。
下溢为0.000000或4.203895e-45
Min float exp是-37。

    获得“低于最低”的2种可能性:


    注意“次正常”。 次正规(或非正规)数的一个令人信服的理由在于以下问题。

     float a,b; ... // somehow a and b are set. // Are the 2 below equivalent? if (a == b) foo(); if ((a - b) == 0) foo(); 

    如果没有次正规数,则FLT_MIN附近的2个几乎相同的数值将具有远低于FLT_MIN的非零数学差异,并且结果将舍入为0.0

    对于次正规数,每对不同float的差值可以用0.0以外的其他值表示。 **

    ** + +0.0, -0.0除外。 签名零有自己的特点。

    在非常简单,不精确的术语中,浮点存储为0.xxxxx x 2 ^ yyyyyy。 “正常”数字在xxxxx部分中不需要前导零。 因此,您可以制作的最小数字是0.10000 x 2 ^ -111111。 但是,如果你“欺骗”并非规范化数字,你可以制作一个像0.000001 x 2 ^ -111111,这个更小但有效位数更少。

    见https://en.wikipedia.org/wiki/Denormal_number

    y = (+/-) significand x base ^ (exponent - precision)数和y = (+/-) significand x base ^ (exponent - precision)表示为浮点数,如果确保significand >= base ^ (precision - 1) ,则每个y != 0都有唯一的表示forms。 满足此要求的非零y称为标准化 。 现在FLT_MIN是最小标准化正float ,而FLT_TRUE_MIN是没有标准化限制的真正最小值。

    换句话说, FLT_MIN = base ^ (FLT_MIN_EXP - 1)FLT_TRUE_MIN = base ^ (FLT_MIN_EXP - precision)

      以上就是c/c++开发分享漂浮小于FLT_MIN。 为什么FLT_TRUE_MIN?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560061.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐