【问题标题】:Disable floating point exceptions during a single function在单个函数期间禁用浮点异常
【发布时间】:2016-04-19 01:17:23
【问题描述】:

我可以将我的 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吗?如果您想屏蔽浮点异常,请使用 RTL 函数来执行此操作。
  • @DavidHeffernan,见docwiki.embarcadero.com/RADStudio/XE/en/…。但自 XE2 以来它没有记录。
  • {$finiteFloat} 关闭浮点错误 {$J+} 将允许您在运行时更改常量我相信两者都可能是危险的,宁愿避免它们。
  • 为什么不使用 {$J+}?它是如何关联的?
  • 这和他的问题完全没有关系,是一个意见陈述。我编辑了这个问题,因为应该以网站上的其他人可以找到的方式提出问题。我更改了问题标题,因为它没有意义。此外,问题的文本应说明您要做什么。真正的人。

标签: delphi delphi-xe6


【解决方案1】:

此编译器指令仅适用于现已失效的 .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 如何仅在 .net 编译器中使用 $FINITEFLOAT。这篇文章还解释了为什么 .net 需要这个指令。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2011-01-14
  • 1970-01-01
相关资源
最近更新 更多