在单个函数期间禁用浮点异常
Disable floating point exceptions during a single function
我可以将我的 Delphi 代码包装在未记录的 {$finiteFloat OFF|ON}
编译器指令中,如下所示,以在函数期间禁用浮点异常吗?
{$finiteFloat OFF}
a := 5.0;
b := 0.0;
c := a/b; // do not raise exception here!
{$finiteFloat ON}
我知道我可以用 {$J} 处理常量,但我认为 {$finiteFloat} 做不到,因为它的范围是全局的。任何人都可以确认吗?
此编译器指令仅适用于现已停用的 .net 编译器,这解释了为什么没有记录它。因此,该指令对您的程序没有影响,因为您没有使用 .net 编译器。要使用编译器屏蔽浮点异常,请调用 SetExceptionMask
。
来自 Hallvard Vassbotn 的 article 显示了以下示例代码,说明了这一点:
{$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
请注意 Hallvard 如何仅将 $FINITEFLOAT
与 .net 编译器一起使用。文章还解释了为什么 .net 需要此指令。
我可以将我的 Delphi 代码包装在未记录的 {$finiteFloat OFF|ON}
编译器指令中,如下所示,以在函数期间禁用浮点异常吗?
{$finiteFloat OFF}
a := 5.0;
b := 0.0;
c := a/b; // do not raise exception here!
{$finiteFloat ON}
我知道我可以用 {$J} 处理常量,但我认为 {$finiteFloat} 做不到,因为它的范围是全局的。任何人都可以确认吗?
此编译器指令仅适用于现已停用的 .net 编译器,这解释了为什么没有记录它。因此,该指令对您的程序没有影响,因为您没有使用 .net 编译器。要使用编译器屏蔽浮点异常,请调用 SetExceptionMask
。
来自 Hallvard Vassbotn 的 article 显示了以下示例代码,说明了这一点:
{$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
请注意 Hallvard 如何仅将 $FINITEFLOAT
与 .net 编译器一起使用。文章还解释了为什么 .net 需要此指令。