内容简介: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 即将出现......
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Programming Amazon Web Services
James Murty / O'Reilly Media / 2008-3-25 / USD 49.99
Building on the success of its storefront and fulfillment services, Amazon now allows businesses to "rent" computing power, data storage and bandwidth on its vast network platform. This book demonstra......一起来看看 《Programming Amazon Web Services》 这本书的介绍吧!