关于float类型为什么不能与0做比较判断
首先呢:我先用实例给大家显示这样是错误的#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 ,这就是原因喽!!!!
如果支持的人多,我会不定时的发这样奇怪的帖子,支持支持!!!!
不错!!!!!!!!!! 浮点数是有精度的, 一般float 7位 double 16位有效位
你可以debug模式反汇编你的程序看看
0.5000000000000000000
0.4000000059604644352
这是在浮点寄存器里的值
2.9802322276673003520E-09(double类型) 这个是结果 和0比当然不相等
halu 发表于 2016-8-15 16:31
浮点数是有精度的, 一般float 7位 double 16位有效位
你可以debug模式反汇编你的程序看看
0.50000000000 ...
sowhat you want say? 1366627538 发表于 2016-8-15 16:51
sowhat you want say?
把我的回复删了吧 halu 发表于 2016-8-15 16:58
把我的回复删了吧
没事,有事没事您常来~~~
页:
[1]