在单个函数期间禁用浮点异常

ewe*_*rst 1 delphi delphi-xe6

我可以将我的Delphi代码包装在{$finiteFloat OFF|ON}如下所示的未记录的编译器指令中,以在函数期间禁用浮点异常吗?

{$finiteFloat OFF}
a := 5.0;
b := 0.0;
c := a/b;  // do not raise exception here!
{$finiteFloat ON}
Run Code Online (Sandbox Code Playgroud)

我知道我可以在{$ J}的常量的情况下,但我不认为{$ finiteFloat}可以做到这一点,因为它的范围是全局的.谁能确认一下?

Dav*_*nan 6

此编译器指令仅适用于现已解散的.net编译器,这解释了为什么没有记录.因此,由于您没有使用.net编译器,因此该指令对您的程序没有影响.要使用编译器屏蔽浮点异常,请调用SetExceptionMask.

来自Hallvard Vassbotn的这篇文章展示了以下示例代码:

{$IFDEF CLR}
  {$FINITEFLOAT OFF}
{$ELSE}
  Math.SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, 
    exUnderflow, exPrecision]);
{$ENDIF}
One := 0;
Two := 42;
Three := Two / One; // Returns +Inf, no exception raised
Run Code Online (Sandbox Code Playgroud)

请注意Hallvard如何仅$FINITEFLOAT与.net编译器一起使用.该文章还解释了为什么.net上需要此指令.