游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2857|回复: 7

对高质量C++编程指南有点地方始终不理解

[复制链接]

10

主题

24

帖子

24

积分

注册会员

Rank: 2

积分
24
发表于 2008-4-1 11:15:00 | 显示全部楼层 |阅读模式
里面介绍了浮点数与0值比较
        const float EPSIONON = 0.00001
        if((x >= - EPSIONON)&&(x <= EPSIONON)
从字面上看以上语句的意思是如果 x 的值在-0.00001<=x<=0.00001之间if语句为真,如果x为0.000005,x值不为0,if的值也为真了,不就失去比较的意义了么? [em7]

2

主题

23

帖子

38

积分

注册会员

Rank: 2

积分
38
发表于 2008-4-1 14:06:00 | 显示全部楼层

Re:对高质量C++编程指南有点地方始终不理解

浮点数在计算机中以二进制表示.但是有限位的二进制并不能精确表示浮点数.所以要有个阀值.

3

主题

113

帖子

147

积分

注册会员

Rank: 2

积分
147
发表于 2008-4-1 14:46:00 | 显示全部楼层

Re:对高质量C++编程指南有点地方始终不理解

可以定义一个高精度的阀值,根据需求进行使用
#ifdef XXX
const float EPSIONON = 0.00001;
#else
const long double  EPSIONON= 0.00000001;
#endif
但是单纯的"=="对浮点进行判断是非常可笑的,可以看一下浮点IEEE704(似乎是这个浮点定义标准)的浮点保存定义.(-1)n * (2)k * (1+m/2 23).

66

主题

223

帖子

223

积分

中级会员

Rank: 3Rank: 3

积分
223
发表于 2008-4-3 08:01:00 | 显示全部楼层

Re:对高质量C++编程指南有点地方始终不理解

每次都要这样判断?以下程序
float fA = 1.0f;
float fB = 1.0f;
if( fA == fB )
{
        cout<<"fA == fB"<<endl;
}
if( fA == 1.0f )
{
        cout<<"fA == 1.0f"<<endl;
}

两个cout都有输出。是不是编译器自动会加上这个EPSIONON判断?

60

主题

1319

帖子

1319

积分

金牌会员

Rank: 6Rank: 6

积分
1319
发表于 2008-4-3 09:14:00 | 显示全部楼层

Re:对高质量C++编程指南有点地方始终不理解

总之不要直接用"=="来比较就是了,结果不可靠

28

主题

433

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2008-4-10 22:05:00 | 显示全部楼层

Re:对高质量C++编程指南有点地方始终不理解

大哥 浮点数 只要
足够精度近似相等
就够了~~~~

如果是 直接 就 等于~~
我看你这个 程序 几乎 就没有 相等的 机会~

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2008-4-13 12:35:00 | 显示全部楼层

Re:对高质量C++编程指南有点地方始终不理解

首先,2^n是可以精确表示的;
其次,浮点运算的结果具有可预测性;
比如同一平台的同一个编译器,0.1/0.3是怎么表示的,你换个地方执行还会这么表示;
再次,浮点无法准确表示非2幂的情况,例如0.1就没办法准确表示。

1

主题

177

帖子

198

积分

注册会员

Rank: 2

积分
198
QQ
发表于 2008-4-16 20:18:00 | 显示全部楼层

Re:对高质量C++编程指南有点地方始终不理解

LZ肯定是黑客帝国没看懂。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 19:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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