EPSILON的管理
发表于 2007-02-03 07:57 AM 作者: polyrandom
大多数时候,浮点数的运算结果之间是不能直接作相等比较的。譬如说,如果我们要判断一个经过转换的浮点数是不是还是0,通常需要
static const float EPSILON = 0.000001f;
return ( fabsf( f ) < EPSILON );
这会带来一些问题。就拿我现在写的软件来说,因为有很多不同的基础库,它们又被很多程序使用。大多数人在写类似的判断函数的时候,都比较偷懒,他们不会试图在最基本的类库里面放一个判断函数,而是自己局部写一个。这导致了整个系统内有很多相同的代码,作相同的事情,但是使用不同的 EPSILON,有0.00004的,也有0.000001的。更惨的是,很多人已经离开公司,你无法知道那个0.00004是不是有特殊的意义。由于我们产品的特殊性,我们无法冒险去修改任何可能导入错误的地方。
目前听取了一个同事的建议,把所有的EPSILON都起一个名字,然后放在一个XML文件里面,在程序启动时读入。把所有浮点比较代码拉到公共基类里面,但是这些函数都需要传入EPSILON的。每个需要比较的地方根据名字读取配置文件中的值(当然只是一次),把它作为EPSILON传入比较函数。
P.S. 最恐怖的是,有些地方的EPSILON居然是0.1f。
static const float EPSILON = 0.000001f;
return ( fabsf( f ) < EPSILON );
这会带来一些问题。就拿我现在写的软件来说,因为有很多不同的基础库,它们又被很多程序使用。大多数人在写类似的判断函数的时候,都比较偷懒,他们不会试图在最基本的类库里面放一个判断函数,而是自己局部写一个。这导致了整个系统内有很多相同的代码,作相同的事情,但是使用不同的 EPSILON,有0.00004的,也有0.000001的。更惨的是,很多人已经离开公司,你无法知道那个0.00004是不是有特殊的意义。由于我们产品的特殊性,我们无法冒险去修改任何可能导入错误的地方。
目前听取了一个同事的建议,把所有的EPSILON都起一个名字,然后放在一个XML文件里面,在程序启动时读入。把所有浮点比较代码拉到公共基类里面,但是这些函数都需要传入EPSILON的。每个需要比较的地方根据名字读取配置文件中的值(当然只是一次),把它作为EPSILON传入比较函数。
P.S. 最恐怖的是,有些地方的EPSILON居然是0.1f。
评论总数 0
评论
发表评论 |
作者为 polyrandom 的最新文章
- 调试艺术 (2008-04-19)
- operator==的误用? (2007-04-07)
- 体育彩票的概率 (2007-03-10)
- 初始化错误 - 线程和同步变量 (2007-02-28)
- EPSILON的管理 (2007-02-03)




