c语言 double比较大小吗,C语言中两个DOUBLE型变量的比较问题

匿名用户

1级

2006-07-24 回答

由于计算机字长有限,无法精确表示数字,因此对有些数只能是一个近似

double类型的字长是8个字节,而2.001转换成2进制是11.00000...是个无限小数

此类浮点数在计算机内采用 阶码+尾数 方式存储

ieee 64的存储方式如下

阶符 阶码 尾数

double 1 11 52

阶码部分由于有11位因此可以表示2^11次方范围的数 在本题所涉及的数字中没有超过这个范围

按照这个规则

3.001,2.001,1.0的浮点数分别如下

3.001=11.0000 0000 0100 0001 1000 1001 0011 0111 0100 1011 1100 0110 1010 0111

=0.11 0000 0000 0100 0001 1000 1001 0011 0111 0100 1011 1100 0110 1010 01*2^010

2.001=10.0000 0000 0100 0001 1000 1001 0011 0111 0100 1011 1100 0110 1010 0111

=0.10 0000 0000 0100 0001 1000 1001 0011 0111 0100 1011 1100 0110 1010 01*2^010

1.0=1.0=0.1*2^001

符号^代表幂次方

在进行a+=c;

b+=c之后

4.001=100.0000 0000 0100 0001 1000 1001 0011 0111 0100 1011 1100 0110 1010 0111

=0.100 0000 0000 0100 0001 1000 1001 0011 0111 0100 1011 1100 0110 1010 0 *2^011

注意比较一下4 和 3 的尾数的区别

在最后一位4 舍去了一个1 因为头部变成了3位而不是2位,另外阶码变成了011

舍去了这一个1 就使得后面的运算中4.001-3.001<1

后面发现 当a 和 b 都舍去尾数的最后一位时 比较结果就是相等的

并且当整数部分的二进制继续增加一位 8.001时 舍去的是0 不影响比较结果

因此得到如下结果

a==b a!=b a==b a==b a==b a==b a==b a==b a==b a==b

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值