首页
社区
课程
招聘
[求助]浮点指令有没有可能运算失败,得到-1.#INF结果?
发表于: 2010-1-9 22:30 5133

[求助]浮点指令有没有可能运算失败,得到-1.#INF结果?

2010-1-9 22:30
5133
遇到一个非常奇怪的问题,大致是这样的:
1、我设计了一个运算函数,内部浮点运算量非常大,没有用rand之类的任何随机算法来人为制造随机结果。
2、该函数没有调用math库,用到sqrt、sin、cos之类的,都是直接用fsqrt、fsin、fcos等指令直接完成的。
3、该函数在入口处用fnstcw读取浮点控制寄存器后,用fldcw写入0x027F,在退出函数前,用fldcw还原之前保存的内容,以此保证每次调用时的舍入控制、精度控制相同。
4、该函数被编译为DLL的导出函数,之后测试没有重新编译过其代码。

个人认为,这样的一个函数应该已经成为了一个运算结果只与输入参数有关的黑盒子。经过多次测试,被不同的Exe调用也似乎都符合了要求。但是真正应用的时候却出现了一个很奇怪的问题,某些时候,运算结果中会出现-1.#INF(运算结果是多个浮点,中间可能会出现一个)这类无效浮点,而根据我的算法,应该是绝对不可能出现的。
我开始怀疑是否是我的算法有BUG,于是我在调用函数前保存所有参数值,在计算完成后如果发现结果中存在-1.#INF,则将调用参数写入文件。于是我得到了可能会出错的调用参数,然后自己调试这些参数调用,问题是运算结果又是正确的。我让那个出错的Exe强制用这几个参数调用,结果也是正确的。
这就奇怪了,那问题到底还可能发生在哪里呢?难道是FPU的一些状态控制不对,会导致运算过程中出现-1.#INF吗?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
2
不懂纯帮顶,是看到那个熟悉的-1.#INF进来的,我们工程里采用fortran语言进行一些科学计算,有时就会算出
-1.#INF
2010-1-9 23:38
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
浮点运算是否需要在一些地方加入WAIT指令才能保证不出错啊?
2010-1-10 17:47
0
雪    币: 359
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
应该可以确认这问题与WAIT无关了。
另外我修改了调用方法,给一次调用留三次机会,如果发现一次计算结果包含-1.#INF,则直接还原参数重新调用,如果重新调用后再次出现-1.#INF,那么写文件错误日志。可结果再也没出现过错误日志了。
难道浮点计算真会概率性失败吗?不知道到底与什么有关……
2010-1-11 15:09
0
游客
登录 | 注册 方可回帖
返回
//