为了看看在浮动下溢的情况下会发生什么,我发现我可以使浮点数比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