plp626 发表于 2012-05-28 11:23

本帖最后由 plp626 于 2012-05-28 11:48 编辑

底下研究过,所谓浮点数不能比较相等有原因; 但以下情况可以比较相等:

所比较的两个数是所在范围内可以被... 2^-2, 2^-1, 2^0, 2^1, 2^2, ... 线性组合表示出来的(每个基的系数范围是[-9,9]);

32位机,float型数据最多可表示 2^32个“精确数”,这些数的相等比较可以用 if(a==b) 来判等;

{1}. float a=1.75,b=1.25; // a,b 都在精确数集合中,他们的和,差必在精确数集合中;
可以
if(a-b==0.5)  。。。。

{2}. float a=1.9, b=1.4; // a,b 都不在精确数集合中, 但他们的差在精确数集合中;
if(a-b==0.5) 。。。。
因为0.5是在32位“精确数”集合中;
第2中情况,会因为受32位范围限制,在a,b,期中之一处于32边界状态下,不成立,

但是,
float a=1.5, b=1.4;
if(a-b==0.1) 则是不可以的;
因为0.1不在32位“精确数”集合中

pmerofc 发表于 2012-05-28 11:33

musezh2 发表于 2012-05-28 18:38

不要揪细节,这不是教材。
有不同的意见,可以展开阐述自己的见解

OwnWaterloo 发表于 2012-05-28 19:10

sacry 发表于 2012-05-23 10:10 static/image/common/back.gif
但是我也觉得,如果你知道有IEEE浮点标准,也许就不会起这么个标题了。

因为不知道IEEE754而吵起来这事常见。但LZ肯定知道IEEE754:
ifreecoding 发表于 2012-05-22 19:23 static/image/common/back.gif
... 略
C语言浮点数
... 略
ANSI/IEEE Std 754-1985标准
... 略


所以我就奇怪了:既然是在说IEEE754,干嘛要扣上C的帽子?
改为《IEEE754原理...》并在支持IEEE754的平台上写一些C的示例以演示这些原理等等。
就精确了,想挑刺都没处下手。

sacry 发表于 2012-05-23 10:10 static/image/common/back.gif
PS:发现有时候想找别人的逻辑错误挺难的。因为对方压根没有什么逻辑,找不到论点。
:luya:

starwing83 发表于 2012-05-28 19:32

回复 24# OwnWaterloo


    OW居然又复出了?

OwnWaterloo 发表于 2012-05-28 20:25

回复 25# starwing83

啥叫复出?我说过退出么?

最近被haskell折腾了……最终结果来说,除了cpp(C预处理器,不是C++),其他都还不算太坏……
erlang我就是因为看见它的macro几乎原样搬cpp就想吐……   结果haskell(至少是haskell实现)也将cpp搬过来了……而且还不支持#与##……
这些个语言啊…… C里面优秀的东西不学,狗屎一般的语法与预处理器倒是都喜欢借鉴……

libra0925 发表于 2013-03-27 11:38

强烈要求删除此贴,误人子弟,楼主都没有对自己发的帖子进行审核,其中很多地方需要指数方式表示,直接无视,严重抗议!

庖丁解犇 发表于 2013-04-02 22:33

谢谢楼主,个人觉得不错,赞一个

fenghw8088 发表于 2013-04-03 09:35

研究、总结、分享的思路挺好的!
有没有人研究在有限精度下的计算优化或数据压缩?
比如存钱时,只需精确到分即可,能否压缩?如果计算更快?

lin5161678 发表于 2013-06-07 15:57

回复 16# sacry

哈哈 说得真好 支持支持
   
页: 1 2 [3] 4
查看完整版本: C语言浮点数运算,讲述原理并总结一些案例