鱼C论坛

 找回密码
 立即注册
查看: 2229|回复: 5

[技术交流] 关于float类型为什么不能与0做比较判断

[复制链接]
发表于 2016-8-11 20:24:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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 ,这就是原因喽!!!!

                                                                                                          如果支持的人多,我会不定时的发这样奇怪的帖子,支持支持!!!!


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-11 21:48:25 | 显示全部楼层
不错!!!!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-8-15 16:31:52 | 显示全部楼层
浮点数是有精度的, 一般float 7位 double 16位有效位
你可以debug模式反汇编你的程序看看
0.5000000000000000000
0.4000000059604644352
这是在浮点寄存器里的值
2.9802322276673003520E-09(double类型) 这个是结果 和0比当然不相等
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-15 16:51:44 | 显示全部楼层
halu 发表于 2016-8-15 16:31
浮点数是有精度的, 一般float 7位 double 16位有效位
你可以debug模式反汇编你的程序看看
0.50000000000 ...

so  what you want say?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-15 16:58:16 | 显示全部楼层
1366627538 发表于 2016-8-15 16:51
so  what you want say?

把我的回复删了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-8-15 17:58:39 | 显示全部楼层
halu 发表于 2016-8-15 16:58
把我的回复删了吧

没事,有事没事您常来~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 07:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表