个人档案中DBL_TRUE_MIN的概念和意向

个人档案中DBL_TRUE_MIN的概念和意向

搬自己2016年11月22日叫SegmentFault发表之章。链接:https://segmentfault.com/a/1190000007565915


于念C Prime
Plus的进程遭到遇到了立道复习题,利用寻引擎加上自己的局部琢磨,初步得出了定论,如发荒唐的远在,还向不吝赐教

下列循环中,如果valuedouble类型,会面世什么问题?

for (value = 36; value > 0; value /= 2)
  printf("%3d", value);

想运行结果:如果valuedouble品种,计算过程遭到会招致极端循环(直到超过double色的精度表示范围),又为printf为整型形式打印数字,会于末出现过多独数字0

答案中指明了这种光景的名词:浮点数下溢(underflow)

实则运作结果:

...(很多个0)
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 0  0  0  0  0-21474836481073741824536870912-1879048192120795955260397977630198
98881509949447549747237748736188743689437184471859223592961179648589824294912147
4567372836864184329216460823041152576288144 72 36 18  9  4  2  1请按任意键继续.
. .

的确出现了好多独0,但是以许多个0的背后又莫名其妙多发生了同等堆放整数。为了分离有后面的丰富数字,修改格式化字符串为" %3d",结果如下:

...(很多个0)
0   0   0   0   0 -2147483648 1073741824 536870912 -1879048192 1207959552 603
979776 301989888 150994944 75497472 37748736 18874368 9437184 4718592 2359296 11
79648 589824 294912 147456 73728 36864 18432 9216 4608 2304 1152 576 288 144  72
36  18   9   4   2   1请按任意键继续. . .

为进一步将明白产生这种气象之来由,继续修改格式化字符串为" %.3le",结果如下:

...
  4.663e-317 2.331e-317 1.166e-317 5.828e-318 2.914e-318 1.457e-318 7.285e-319 3
.643e-319 1.821e-319 9.107e-320 4.553e-320 2.277e-320 1.138e-320 5.692e-321 2.84
6e-321 1.423e-321 7.115e-322 3.557e-322 1.779e-322 8.893e-323 4.447e-323 1.976e-
323 9.881e-324 4.941e-324请按任意键继续. . .

得视,以整型输出的double类型变量实际上一直以减少,应该是double每当内存中叫截断读取为int此后导致了展示也整数的状况。

查看<float.h>头文件,找到两单跟double列精度有关的明示常量:

#define DBL_MIN          2.2250738585072014e-308 // min positive value
#define DBL_TRUE_MIN     4.9406564584124654e-324 // min positive value

得视,导致循环终止的因由是,循环中最终一个数字4.941e-324除开因2过后的结果小于DBL_TRUE_MIN的值

为什么<float.h>面临假如运用DBL_MINDBL_TRUE_MIN些微只具有同等注释的常量?我首先使用寻引擎查及了这样一个带动注释的版本:

#ifndef DBL_TRUE_MIN
/* DBL_TRUE_MIN is a common non-standard extension for the minimum denorm value
 * DBL_MIN is the minimum non-denorm value -- use that if TRUE_MIN is not defined */
#define DBL_TRUE_MIN DBL_MIN
#endif

诠释部分大意为,DBL_TRUE_MIN是针对性最好小非规格化浮点数(Denormal
number
)的通用非标准扩充,而DBL_MIN才是最好小非规格化浮点数的值,并且仅以DBL_TRUE_MIN莫定义时行使。

C11标准 §5.2.4.2.2.13蒙涉嫌了DBL_TRUE_MIN

The values given in the following list shall be replaced by constant
expressions with implementation-defined (positive) values that are
less than or equal to those shown:
— minimum normalized positive floating-point number,
bemin−1
FLT_MIN 1E-37
DBL_MIN 1E-37
LDBL_MIN 1E-37
— minimum positive floating-point number
FLT_TRUE_MIN 1E-37
DBL_TRUE_MIN 1E-37
LDBL_TRUE_MIN 1E-37
(If the presence or absence of subnormal numbers is indeterminable,
then the value is intended to be a positive number no greater than the
minimum normalized positive number for the type.)

据悉上面查到的音信,我得出了以下的定论:

先是,浮点数在处理器中起规格化数和非规格化数片种植表示法。C标准于这边规定了个别栽浮点数的极小在。具体值的轻重是由于实现来定义的(由编译器等来控制),但是不得低于列有的这些价值。并且,如果没有确定非规格化数是否会出现,DBL_TRUE_MIN的价值应该是一个低于等于该类型最小正规格化数DBL_MIN的值,FLT_TRUE_MINLDBL_TRUE_MIN同理。

本来想快点看了马上按照开的,结果遇见一个施不晓的问题即使翻了那个丰富日子……这个实际上并无是一个吓习惯。不过,反正自己要好已经翻了了,可能出成百上千民用知道不科学的地方,但是只要得以帮助到其他人,我作至这边的目的就达了

admin

网站地图xml地图