超难问题:怎样查出系统中的浮点数比较相关src?

wugf 2009-06-15 11:23:15
手上有一个C语言的系统正在进行AIX(XLC)到Linux(gcc)的移植。在移植过程中发现原系统有以下问题:
浮点数的比较统统使用的是 fA > fB的方式,而不是 -0.0001<fA-fB<0.0001
这样就导致相同的数据在AIX上跑出来的是 fA > fB = true, Linux上却是false。

所以,决定对这块进行修改。但是src量非常巨大,单单有比较(用>,<,=,<=,>=进行检索,所以包括整数、浮点、char等比较)的地方就有7万行,必须一个一个精查,发现是浮点比较的时候修改为正确的比较方式。而且因为是人工判断,还很容易遗漏出错。

不知道大家以前是否碰到过类似的问题,是否有什么比较便捷的方法?(修改的工作量预计不大,所以可以手工对应)
比如:
修改编译器的选项,让编译器自动对浮点数加上正确的比较方法。
有什么现成的工具可以自动检索出所有浮点相关的比较运算

如果实在不行的话,只有自己做一个词法语法分析器了
...全文
32 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jikeyuan1 2011-01-24
  • 打赏
  • 举报
回复

不懂
booksoon 2009-06-17
  • 打赏
  • 举报
回复
学习了~~~
wugf 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 akirya 的回复:]
...我试了一下,报错在使用的行上面。呵,实际操作起来还是可行的。...
[/Quote]

感谢这位兄弟。看来实践出真理啊。但是你的做法可能有些小问题,比如 intA/3 > 0,这个可能就无法发现了。当然,从业务的角度来说,我这个例子即使不修改为|A-B|<0.00001也应该没有问题,但是不排除类似的表达式从业务角度来说也没有问题。

最近几天也在思考这个问题,突然发现一个比较可行的精查方法:
1, 替换所有<,> >=...为==
2, 追加编译参数:-Wfloat-equal
Warn if floating point values are used in equality comparisons.

哈哈哈,这样不就用编译器检查出所有有问题的地方了嘛

最后,再次感谢各位的大力支持,感谢CCTV,感谢NJTV,感谢我的父母,感谢楼上各位。
mymtom 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 georgewen 的回复:]
引用 7 楼 akirya 的回复:
引用 5 楼 wugf 的回复:
引用 4 楼 hikaliv 的回复:
与其做一个词法分析器……不如自己全部改一遍。用FIND-REPLACE的话应该不会有差。


这么做不太现实,改是很容易的,但是检查是否是Float比较,这个很痛苦,而且很容易出错。7万行啊,不是小数目。


突然想到了一个简单的方法,
现将整个工程的float和double替换成___float啥的,定义一个__float结构体。这样在进行运算和比较的时候会有编…
[/Quote]
学习了,天才呀。
georgewen 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 akirya 的回复:]
引用 5 楼 wugf 的回复:
引用 4 楼 hikaliv 的回复:
与其做一个词法分析器……不如自己全部改一遍。用FIND-REPLACE的话应该不会有差。


这么做不太现实,改是很容易的,但是检查是否是Float比较,这个很痛苦,而且很容易出错。7万行啊,不是小数目。


突然想到了一个简单的方法,
现将整个工程的float和double替换成___float啥的,定义一个__float结构体。这样在进行运算和比较的时候会有编译错误。
然后用工具将…
[/Quote]
太有才了!
光宇广贞 2009-06-15
  • 打赏
  • 举报
回复
我只对C熟,不知道你特别要求“浮点数”比较有何用,恐怕这也是坛友大多数人的疑问。

像你这种……

-0.001 < fa-fb < 0.001

的写法,如果 fa 与 fb 为非浮点型的话,会报WARNING的……这是不是一种检查方法呢……
wugf 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hikaliv 的回复:]
与其做一个词法分析器……不如自己全部改一遍。用FIND-REPLACE的话应该不会有差。
[/Quote]

这么做不太现实,改是很容易的,但是检查是否是Float比较,这个很痛苦,而且很容易出错。7万行啊,不是小数目。
光宇广贞 2009-06-15
  • 打赏
  • 举报
回复
与其做一个词法分析器……不如自己全部改一遍。用FIND-REPLACE的话应该不会有差。

forwrj 2009-06-15
  • 打赏
  • 举报
回复
#define TRUE 1
#define FALSE 0
#define MIN_SIGN 0.00001
/*相等*/
#define EQUAL_TO((a),(b)) (((a - b) > (-)MIN_SIGN) && ((a - b) < MIN_SIGN)))? TRUE : FALSE

/*小于*/
#define LESS_THEN((a),(b)) (a - b < (-)MIN_SIGN) ? TRUE:FALSE

/*大于*/

#define BIG_THEN ((a),(b)) (a - b > MIN_SIGN) ?TRUE:FALSE
  • 打赏
  • 举报
回复
[Quote=引用楼主 wugf 的帖子:]
手上有一个C语言的系统正在进行AIX(XLC)到Linux(gcc)的移植。在移植过程中发现原系统有以下问题:
浮点数的比较统统使用的是fA > fB的方式,而不是-0.0001 <fA-fB <0.0001。
这样就导致相同的数据在AIX上跑出来的是 fA > fB = true, Linux上却是false。

所以,决定对这块进行修改。但是src量非常巨大,单单有比较(用>, <,=, <=,>=进行检索,所以包括整数、浮点、char等比较)的地方就有7万行,必须一个一个精查,发现是浮…
[/Quote]
要是C++就好办一些
将> <等几个比较函数替换成同名函数(这点用正则替换) ,让重载出一个针对浮点数的比较即可。
goodname 2009-06-15
  • 打赏
  • 举报
回复
确实超难。。。
只能帮顶。。。
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wugf 的回复:]
引用 7 楼 akirya 的回复:
引用 5 楼 wugf 的回复:
引用 4 楼 hikaliv 的回复:
与其做一个词法分析器……不如自己全部改一遍。用FIND-REPLACE的话应该不会有差。


这么做不太现实,改是很容易的,但是检查是否是Float比较,这个很痛苦,而且很容易出错。7万行啊,不是小数目。


突然想到了一个简单的方法,
现将整个工程的float和double替换成___float啥的,定义一个__float结构体。这样在进行运算和比较的时候会有编…
[/Quote]
我试了一下,报错在使用的行上面。呵,实际操作起来还是可行的。
wugf 2009-06-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 akirya 的回复:]
引用 5 楼 wugf 的回复:
引用 4 楼 hikaliv 的回复:
与其做一个词法分析器……不如自己全部改一遍。用FIND-REPLACE的话应该不会有差。


这么做不太现实,改是很容易的,但是检查是否是Float比较,这个很痛苦,而且很容易出错。7万行啊,不是小数目。


突然想到了一个简单的方法,
现将整个工程的float和double替换成___float啥的,定义一个__float结构体。这样在进行运算和比较的时候会有编译错误。
然后用工具将…
[/Quote]

想法是好的,但是实际操作起来有以下问题:
不仅仅比较的地方出编译错误,其他任何使用到这个变量的地方都会有编译错误。而C语言经常会因为上一行出错信息而覆盖掉后面的错误信息
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wugf 的回复:]
引用 4 楼 hikaliv 的回复:
与其做一个词法分析器……不如自己全部改一遍。用FIND-REPLACE的话应该不会有差。


这么做不太现实,改是很容易的,但是检查是否是Float比较,这个很痛苦,而且很容易出错。7万行啊,不是小数目。
[/Quote]
突然想到了一个简单的方法,
现将整个工程的float和double替换成___float啥的,定义一个__float结构体。这样在进行运算和比较的时候会有编译错误。
然后用工具将所有的比较错误摘出来改。然后再将__float啥的替换回去.

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧