nick young 女朋友:C语言中两个DOUBLE型变量的比较问题

来源:百度文库 编辑:中科新闻网 时间:2024/04/30 00:23:42
#include <iostream.h>
#include <WINDOWS.H>
#include <string.h>
#include <stdio.h>
#include <LIMITS.H>
#include <FLOAT.H>

void main()
{
int i;
double a=2.001;
double b=3.001;
double c=1.0;

for(i=0;i<10;i++)
{
if((b-a)==c)
printf("a==b\n");
else
printf("a!=b\n");
a += c;
b += c;
}
}

由于计算机字长有限,无法精确表示数字,因此对有些数只能是一个近似
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

不明白你要做什么