c语言浮点数和整数转换的分析,C语言浮点数和整数转换的分析

本文分析了C语言中浮点数(如float、double)与整数转换的过程,特别是在IEEE浮点标准下。讨论了浮点数表示的非均匀分布特性,以及转换时的步长、舍入规则。提供了一个不使用浮点运算的`float_i2f`函数实现,将整数转换为float的表示形式。通过对不同整数值的测试,验证了转换的正确性。
摘要由CSDN通过智能技术生成

这里以C语言的浮点数为例,在IEEE浮点标准下,整数转换为浮点数的过程做一些直观的分析和具体的实现,IEEE浮点数的标准细节详见(http://en.wikipedia.org/wiki/IEEE_754-2008)。

在C语言中,使用float和double类型数据分别对应单精度和双精度的浮点格式。以float为例,由于float是32位,int在32位机器上也是32位。因此,float必然不能对所有的int进行准确的表示。实际上,在数轴上,浮点数所能表示的数呈非均匀的分布。举例如下图。

.     . -3  .   .  .  .-2  . . .  -1..........0.........1.. . .   . 2 .  .     .      3.       .

图中的点代表float可表示的数,可以看出,在所能表示的数中,接近0的比较密集,远离0的则步长逐渐增大。具体的步长可以根据浮点数标准算出。

以float为例,符号位1位,阶码8位,位数23位。由IEEE浮点的标准可知,非规格化数表示那些非常接近0.0的数。这时候,阶码域全为0.因此,非规格化数的步长为

2-23×2-127 ≈ 1.4×10-45

而非规格化数的范围则约等于   -1.2×10-38 到1.2×10-38 在这个范围内,float能表示的数呈均匀分布。

而int则处在规格化数的范围内。对于规格化数,步长不均匀。步长可表示为

2-23×2E

其中,E的取值范围是-126~+127。显然,随着E增大,步长增大。因此,对于越远离0的区域,步长越大。当E =  30时,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值