c语言中 浮点数 范围,C语言中浮点数表示范围浅析.doc

C语言中浮点数表示范围浅析

C语言中浮点数表示范围浅析

摘 要:浮点数是C语言中的一种数据类型,但在标准C中并没有给出其具体的描述,即数的存储格式及表示范围。部分经典的C语言程序设计教程中给出了浮点数的表示范围,但存在不严谨和值得商榷的地方。结合IEEE754标准,就C语言中浮点数内在存储格式进行分析并给出结论。

关键词:C语言;浮点数;表示范围

中图分类号:TP313 文献标识码:A

Abstract:The float is a data type in C language,but its in standard C and did not give a specific of description:that is the number of storage format and the scope of representation.Part of classically C language programming tutorial gives a range of floating-point represent,but there is not rigorous and need to discussion.Combined IEEE754 standards,provided analyzation and conclusions in C language in internal storage floating-point format.

Keywords:C language;floating-point;scope of representation

1 引言(Introduction)

浮点数运算是科学计算必须面对的问题,由于计算机内部本身不能精确地处理某些整数或小数,因此在运算时可能存在较大的误差,运算结果将直接影响到系统的可靠性和安全性等。C语言因功能强大、程序设计灵活且支持底层应用,在科学计算、数据处理等领域中得到了广泛应用,但C语言在浮点数运算方面也存在数据表示的不精确性等问题。经典C语言并没有对浮点数专门说明,国内很多教材虽述及浮点数,但也只是给出表示范围,对于浮点数的解释尚不够充分,描述尚不够严谨,因此学生在对浮点数的学习过程中经常存在这样或那样理解上的困惑。这里就浮点数的表示范围,结合IEEE754做进一步的分析,为以后浮点数教学和学习给出参考[1]。

2 浮点数的表示及范围(The range of floating-point and representation)

总体而言,浮点数的表示形式一般格式指满足一般的二进制数机器码(包括定点整数和定点小数)的规定规则;而IEEE754[2]格式则在一般格式上进一步做了一些约定,以便表示数时比较方便和高效。

(1)一般表示法

其主要有两种格式,分别如图1和图2所示。

一般浮点数尾数采用纯小数(隐含位为0)来表示,即尾数M与定点小数表示方法相同,由于尾数的符号位决定整个浮点数的符号,故有时采用图2的形式;当尾数真值为0(不论阶码何值),或阶码的值比能在机器中表示的最小值还小,计算机把该浮点数看成零值,称为机器零,即浮点数表示不了真值绝对值很接近0的数,只能看成0处理;尾数通常用原码或补码表示,阶码一般用移码或补码表示。因此其表示范围如图3所示。

3 C语言中浮点数的表示(C language representation of floating point numbers)

C语言所使用的浮点数符合IEEE754标准,该标准在1985年审核通过,目的是让遵守IEEE标准的机器之间运行的程序可以相互直接移植,另外也让程序员可以轻松写出有用的、鲁棒的浮点数应用程序。

3.1 IEEE754

IEEE标准从逻辑上用三元组{S,E,M}表示一个数N[3],如图4所示。

IEEE标准754规定了三种浮点数格式:单精度、双精度、扩展精度,分别对应C语言里头的float、double和long double。不同的编译系统对long double型的处理方法不同,Turbo c分配16个字节,而Visual C++6.0则分配8个字节。

单精度:N共32位,其中S占1位、E占8位、M占23位,如图5所示。

M虽然是23位或者52位,但它们只是表示小数点之后的二进制位数,也就是说,假定 M为“010110011...”,在二进制数值上其实是“.010110011...”。而事实上,标准规定小数点左边还有一个隐含位[4],绝大多数情况下是1,当N对应的n非常小的时候,比如小于2^(-126)(32位单精度浮点数),于是M对应的m最后结果可能是“m=1.010110011.

### 计算机组成原理中的浮点数表示范围 在计算机科学中,浮点数表示遵循IEEE 754标准,该标准定义了单精度(32位)和双精度(64位)两种常见格式。每种格式都规定了特定数量的比特用于符号位、指数部分和尾数部分。 #### 单精度浮点数(32位) 对于单精度浮点数: - 符号位:1位 - 阶码(Exponent, E):8位 - 尾数(Fraction/Mantissa, f):23位 根据这些分配,最大正数值可以通过设置阶码为全1减去偏置值(bias),而尾数则全部设为1来获得;最小正值则是阶码最低有效配置加上隐含的前导1作为尾数的一部分[^1]。 具体来说,在单精度情况下: -23})\times 2^{128} ≈ 3.40282347 × 10^{38} \)[^4] - 最小正常化正数约为 \( 2^{-126} ≈ 1.17549435 × 10^{-38} \) #### 双精度浮点数(64位) 而对于双精度浮点数而言: - 符号位:1位 - 阶码:11位 - 尾数:52位 同样地应用上述逻辑计算得到的结果如下: - 偏置量 \( bias = 1023 \) - 正常化的最大有限数接近于 \( (2 - 2^{-52})\times 2^{1024} ≈ 1.7976931348623157 × 10^{308} \) - 最小正常化正数约等于 \( 2^{-1022} ≈ 2.2250738585072014 × 10^{-308} \) 为了更好地理解如何处理超出此范围的情况,考虑以下Python代码片段展示了一个简单的尝试创建超过单精度上限的浮点数的例子: ```python import struct def float_to_hex(f): return hex(struct.unpack('<I', struct.pack('<f', f))[0]) max_single_precision = 3.40282347e+38 print(float_to_hex(max_single_precision)) # 输出对应的十六进制表示形式 ``` 这段程序会打印出`0x7f7fffff`,这是单精度浮点数能够表达的最大合法值之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值