Delphi/c++builder 中出现 “float operation exception”

栏目: 编程语言 · 发布时间: 8年前

内容简介: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  )

另外, 这里还有一篇文章介绍 fpu 的工作方式:

http://www.website.masmforum.com/tutorials/fptute/fpuchap1.htm

byNeil

byNeil.com

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算机组成与设计硬件/软件接口

计算机组成与设计硬件/软件接口

[美] David A.Patterson、John L.Hennessy / 郑纬民 / 机械工业出版社 / 2007-4 / 75.00元

《计算机组成与设计硬件:软件接口》(原书第3版)是计算机组成的经典教材。全书着眼于当前计算机设计中最基本的概念,展示了软硬件间的关系,并全面介绍当代计算机系统发展的主流技术和最新成就。同以往版本一样,《计算机组成与设计硬件:软件接口》(原书第3版)采用MIPS处理器作为展示计算机硬件技术基本功能的核心。书中逐条指令地列举了完整的MIPS指令集,并介绍了网络和多处理器结构的基本内容。将CPU性能和程......一起来看看 《计算机组成与设计硬件/软件接口》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具