内容简介:Delphi/c++builder 中出现 “float operation exception”
编译好的 dll 在 c++ builder 64 位中调用,出现 “float operation exception”.
尝试了 32位, 没有问题.
尝试了纯console 的 c++ builder 程序, 也没有问题. 只有包含 vcl 的 c++ builder 程序才有问题.
让我感觉到可能是 vcl 改变了 runtime 的某种行为.
跟踪了代码, 异常发生在这一行:
https://github.com/v8/v8/blob/3.20.17/src/conversions.h#L75
inline int FastD2I(double x) { return static_cast<int>(x); }
当 x 大于 int 的 max 值时,问题出现.
虽然这种转换会导致溢出, 但是怎么会引发异常呢?
然后找到:
https://www.opengl.org/discussion_boards/showthread.php/156817-Disabling-Floating-Point-Exceptions
看起来, opengl 也遇到相同的问题.
然后找到:
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c310909a-fe07-4a4e-92d7-be2e1dc81137/finding-cause-of-floating-point-invalid-operation?forum=vsdebug
最终找到了这篇文章:
Random and unexpected EXCEPTION_FLT_DIVIDE_BY_ZERO and EXCEPTION_FLT_INVALID__OPERATION
原来 cpu 在操作浮点数时有专门的 fpu 寄存器.
而浮点数如果出现溢出等情况时, 是否导致异常是由一个专门的寄存器 fpcw
控制.
在 windows 平台上, fpcw
的值默认是忽略浮点溢出的异常的.
但是有的程序可能会改变 fpcw
的值, 来引发异常.
解决方案: 执行自己的代码时, 恢复 fpcw
的默认值, 用完再回滚.
头文件:
#include "float.h"
获得当前 fpcw 的值:
int old_fpcw = _controlfp(0,0)
设置 fpcw
为 windows 上的默认值:
_controlfp(MCW_EM, MCW_EM);
用完后, 回滚到原始值:
_controlfp(old_fpcw, _MCW_DN | _MCW_EM |_MCW_RC )
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- sqlserver还原数据库的时候出现提示无法打开备份设备的解决方法(设备出现错误或设备脱)
- Perl舍入错误再次出现
- Pekraut:近期新出现的RAT
- django中出现 错误 Errno 10053
- css3元素出现动画实例
- 免费建站系统,Joomla 4 即将出现......
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
深入浅出Struts 2
Budi Kuniawan / 杨涛、王建桥、杨晓云 / 人民邮电出版社 / 2009-04 / 59.00元
本书是广受赞誉的Struts 2优秀教程,它全面而深入地阐述了Struts 2的各个特性,并指导开发人员如何根据遇到的问题对症下药,选择使用最合适的特性。作者处处从实战出发,在丰富的示例中直观地探讨了许多实用的技术,如数据类型转换、文件上传和下载、提高Struts 2应用的安全性、调试与性能分析、FreeMarker、Velocity、Ajax,等等。跟随作者一道深入Struts 2,聆听大量来之......一起来看看 《深入浅出Struts 2》 这本书的介绍吧!