风气网

关于浮点型数据的疑惑

2024-09-20来自:本站整理
请问:C语言中关于浮点型数据的问题???

实行变量是用有限的存储单元存储的,因此提供的有效数字也是有限的,因此其输出的数字过长将会出现你说描述的结果,其前8位是准确的,后面是随机的数字了。
因存储单元空间有限,不同变量有不同存储单元,其范围也不相同,实型变量范围就是-3.4*10E-38~3.4*10E38。在范围之外就不是实型变量了。谭浩强的书不错可多读几遍。

可以这样理解:浮点数由有效数及指数两部分组成,你提到的两个值,应该说一个是一个是最大数,一个是最小精度值。其实如果是从值的范围来说,这个编译环境下面,最小的负数应该是可以表示到-3.402823466 E+38,在-3.402823466 E+38到+3.402823466 E+38之间的数,都是可以表示的。(但不一定是准确表示,因为作为数学上的有理数是连续的,而对于计算机上用二进制位表示的数,是离散的,所以,可能会出现有一些很接近的值,在计算机内表示都是相同的,即是说不能区别)。所以-100自然就是在这个最小到最大值范围内了。

*****float型在内存中占4个字节,即32位,同样int或long型也占4个字节,在对各自的32位进行逐位分解后发现,它们所代表的具体意义却相差甚远。

*****首先分解整形的32位,对于无符号整形(unsigned int) ,分解如下:至右向左把第i位的值记为bi(0或1),则这一位代表的十进制数值为:bi * 2^i, i=0,2,...31。整形的4个字节(32位)二进制数折算成十进制数为:b31 * 2^31 + ... + bi * 2^i + ... + b1 * 2 + b0 * 1 ——记为“公式@”。

*****对于有符号整形(signed int),最高位(第31位)代表符号,0正1负,剩余的31位必须减1再各位取反,记为“操作#”,然后按以上“公式@”得出这个整形数的绝对值。

*****以上作为一个引子,以下float分解也必须建立在此基础上,记住“操作#”和“公式@”两个约定的含义。同时纠正一下提问者的说法“能表达的范围应该也就0-2^32”,整型准确的数值范围为:有符号( (-2^31) —— (2^31-1)),无符号( 0 —— (2^32-1) )。下面引导到关键问题上,float的32位在内存中到底分别代表什么意义?

*****把所有32位用b31-b0(从高到低)表示,b31同样是符号位,其意义为0正1负。b30-b23总共8位是一个有符号整形(signed int),先后用“操作#”和“公式@”计算得到一个数值E (十进制范围是-128 —— 127),再由它经过指数运算得到2^E,十进制范围是:1.0 * 10^(-38) —— 1.7 * 10^38 。余下的23位b22-b0代表小数值,其中b22代表的十进制数值为:b22 * 2^(-1)即b22 * 0.5, b21代表的十进制数值为:b22 * 2^(-2)即b22 * 0.25,以此类推,所以小数范围为0 —— 1(实际为0.0000…1 至 0.9999…) 。

*****从以上分解可知,float的32位都有了各自的意义,可以分为3块,符号块S (b31),指数块E (b30-b23),小数块D(b22-b0),但如何组装成一个实际的小树呢?具体算法就是:
(-1)^S * (1.0 + D) * 2^E ,最终数值范围是-3.4*10^-38 —— 3.4*10^38。

*****最后提醒一下,所有浮点数在进出内存时都经过相应的硬件进行以上“操作#”和“公式@”。编程人员无需深究其中细节,如若是出于好奇心,那是值得理解并支持地。

浮点数的存储方式是用指数形式存储的,
32位浮点数格式为:
s × × × × × × × eb
× × × × × × × × by0
× × × × × × × × by1
× × × × × × × × by2
其中:×表示一位二进制数0或1;eb 为指数的偏差;s为浮点数的符号位,s=0为正数,s=1为负数;小数点“·”在eb的右边;by0 by1 by2为尾数的小数部分。浮点数隐含其整数部分为1。

浮点数的机内表示法建议去查看一下《计算机组成原理》,对于你的问题会有很大的帮助。
大概说一下,浮点数是表示成
(+/-)2^E*M
2的E次幂乘尾数M,M是纯小数
如果32位浮点数用1位符号8位幂(幂也有1位符号)23位尾数,则它的范围是(括号中为二进制数)
-2^(1111111)*(0.1111…1) 至 2^(1111111)*(0.1111…1)
我们使用的cpu实际使用浮点数形式也许不大一样,但原理是相同的

  • [蒲乐莘15571271631] - d是什么意思vup?
    凤临宏::当我们在日常生活中看到或听到一个字母"d",可能会对它的含义感到疑惑。实际上,"d"这个字母在很多场合中都有不同的含义。例如,在计算机编程中,"d"通常代表双精度浮点型数据类型,而在音乐术语中,"d"表示降调。此外,在英语中,"d"在一些...
  • 首页 热门
    返回顶部
    风记网