好的,根据@StoneBird 在此链接中发布的链接特别有用。在这里,我在 c 中创建了一个演示相同的程序。
#include <stdio.h>
#include <math.h>
int main(int argc, char **argv)
{
unsigned int s,e,m;
unsigned int* ptr;
float a,temp=0;
a=1;
float min=pow(2,-129);
while(a>min){
temp=a;
a=a/2;
}
printf("Value=%e\n",temp);
ptr=(unsigned int*)&temp;
s = *ptr >> 31;
e = *ptr & 0x7f800000;
e >>= 23;
m = *ptr & 0x07fffff;
printf("sign = %x\n",s);
printf("exponent = %x\n",e);
printf("mantissa = %x\n",m);
return 0;
}
这里的min变量用于更改最终数字...我使用 min=pow(2,-129)、pow(2,-128) 和 pow(2,-130) 来查看结果并看到了Denormal数字出现。这个 wiki 页面解释了这一切。