马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
首先呢:我先用实例给大家显示这样是错误的
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
void main(){
float fNuma = 0.5,fNumb=0.4;
if (fNuma*fNumb-0.2==0)
printf("是等于。\n");
else
printf("不等于。\n");
system("pause");
}
那为啥就不对了呢 好奇怪噢 。(在这卖个关子) 那咱们就得了解一下 float类型在内存中的存储方式喽! 介绍如下:
举一个简单例子,十进制小数 10.625
1)首先转换整数部分:10 = 1010b
2)小数部分0.625 = 0.101b
3)于是得到 10.625=1010.101b
换个表示方式更加深入理解:
1*(10^1)+0*(10^0)+6*(10^-1)+2*(10^-2)+5*(10^-3) =
1*(2^3) + 0*(2^2) + 1*(2^1) + 0*(2^0) + 1*(2^-1) + 0*(2^-2) + 1*(2^-3)
4) 类似十进制可以用指数形式表示:
10.625=10625*(10^-3)
所得的二进制小数也可以这样指数形式表述:
1010.101b=1010101 * (2^-3)
也就是用有效数字a和指数e来表述: a * (2^e)
用一个32bit的空间(bit0~bit31)来存储这么一个浮点数,如此分配存储空间:
bit0 ~ bit22 共23bit,用来表示有效数字部分,也就是a,本例中a=1010101
bit23 - bit30 共8个bit,用来表是指数,也就是e,范围从-128到127,实际数据中的指数是原始指数加上127得到的,如果超过了127,则从-128开始计,所以这里e=-3表示为124
把上述结果填入32bit的存储器,就是计算机表示小数10.625的形式。
估计我讲到这里 聪明的朋友就能明白喽,存放指数的部分怎么代表0呢 自然那里面储存的不都是0呗,它有它规矩表示0,这就是明明打印的0.00000却偏偏不等于0 ,这就是原因喽!!!!
如果支持的人多,我会不定时的发这样奇怪的帖子,支持支持!!!!
|