Floating point 哪些语言向开发人员暴露IEEE 754陷阱?

Floating point 哪些语言向开发人员暴露IEEE 754陷阱?,floating-point,ieee-754,floating-point-exceptions,Floating Point,Ieee 754,Floating Point Exceptions,出于教育目的,我想玩那些陷阱 数值演算中默认行为的一个常见问题是,我们“忽略”了错误操作中出现的Nan(或+-inf)。默认行为是通过计算进行传播,但某些操作(如比较)会打破链条并松开Nan,其余的处理将继续进行,而不会确认算法前面步骤中的奇异性 有时,我们有办法对此类事件做出反应:延长函数(“在我的情况下为0/0=12”),或者在时域模拟中,扔掉步长并尝试其他设置(如预测器、步长或其他设置) 所以我的问题是:你知道向开发者公开IEEE754陷阱的语言吗?我不想用ASM来解决这个问题。 C,可能

出于教育目的,我想玩那些陷阱

数值演算中默认行为的一个常见问题是,我们“忽略”了错误操作中出现的Nan(或+-inf)。默认行为是通过计算进行传播,但某些操作(如比较)会打破链条并松开Nan,其余的处理将继续进行,而不会确认算法前面步骤中的奇异性

有时,我们有办法对此类事件做出反应:延长函数(“在我的情况下为0/0=12”),或者在时域模拟中,扔掉步长并尝试其他设置(如预测器、步长或其他设置)


所以我的问题是:你知道向开发者公开IEEE754陷阱的语言吗?我不想用ASM来解决这个问题。

C,可能大多数来自它的语言,比如C++或Python(可能是间接访问)。期望低级语言能够得到这样的支持可能是合理的


请参阅其中有许多关于使用IEEE 754编号的脚本和注释。特别是处理浮点异常。最后,从包含大量有用信息的源代码中。

据我所知,在C和C++中处理浮点异常有两种选择:

首先,如果禁用/屏蔽浮点异常(大多数环境默认情况下都会这样做),则可以通过调用来查看是否发生了任何浮点异常。在VisualC++中,FESTESTATE是不可用的,但是您可以很容易地窃取MIW运行时的实现。(它在公共域中。)标记异常后,除非调用feclearexcept,否则不会清除该异常,因此可以在一系列计算结束时调用fetestexcept,查看是否有任何异常。这并没有提供您所要求的陷阱,但它确实可以让您测试像NaN或+/-inf这样的问题是否已经发生,并根据需要作出反应

其次,您可以通过在Linux或Windows中调用来启用/取消屏蔽浮点异常。操作系统如何处理处理器生成的浮点异常取决于您的操作系统

  • 在Linux中,操作系统发送一个SIGFPE信号,因此您可以安装一个信号处理程序来捕获该信号,并设置一个标志,告诉您的例程做出适当的反应
  • 在Windows中,操作系统调用结构化异常处理,将处理器异常转换成语言异常,您可以在C或<代码>使用<代码> >代码> >代码> > catch catch < /Cux>块> C++中的 /<代码> catch < /Cord>块。
  • 更新:对于Mac OS X,如中所述,您应该能够使用
    xmmintrin.h
    中的
    \u MM\u SET\u EXCEPTION\u MASK
    启用/取消屏蔽异常,并且只要使用默认编译器选项(即,不禁用SSE),就应该能够使用SIGFPE捕获异常

< P>(我在C和C++中写了一些关于浮点问题的文章,如果你好奇的话)

我不确定标准是什么,但是我可以告诉你我从经验中看到的,因为它可能有用。我已经用C++编码了,而楠的代码有时是我最糟糕的噩梦。它们静静地出现,并通过计算一直传播到最后,直到我只有无用的输出。我经常不得不创建额外的代码来专门检测导致NaN的情况。我使用Visual C++ 2008,所以我希望它会遵循IEEE标准。p> Maple的编程语言有一个符合IEEE-754标准的数值模型,允许您设置自己的陷阱处理程序(如果需要)。以下是一些链接:

  • (它们很小——大部分只是函数的名称)
  • (陷阱处理程序的Maple术语)
Maple的一个不常见的特性是默认浮点数是十进制(而不是二进制)且具有任意精度。如果要处理64位二进制浮点数,请将它们包装在
HFloat
中。例如,
0.2
精确地表示十进制数,而
HFloat(0.2)
表示将0.2赋值给C中的双精度所得到的相同数字。例如,运行

a := HFloat(0.2);
b := 0.2;
evalf[20](a - b);

这将使用20位十进制数字算术计算
a
b
之间的差异,结果是
0.11E-16

,请您具体一点好吗?我在文档中找不到这个,我找到了如何操作标志,但没有找到如何设置陷阱:谢谢链接。在看了C程序之后(我认为我看起来不错,但在所有这些预处理器噪音中,很难肯定),我没有看到这样暴露的陷阱。我只看到国旗操纵。SIG_FPE处理器似乎是一个平台的特例。这是一个很好的观点,我只是在玩这个,因为我感到幸运,我在mac上有两个平台特定的问题:我添加的链接中的信息在我有限的测试中似乎对我有效。感谢mac OS X链接,这使得处理非常不规则,因为它只适用于sse类型(float和double),而不适用于特定于x87的长双精度。此外,启用异常会对整个进程产生影响,而不是对当前线程,这使得处理异常变得困难。这是好的方面。我不知道还有什么你可以试试的,对不起。就我个人所知,由于我远非浮点方面的专家,有没有什么特别的原因说明在事后使用FetesExcept检查异常是行不通的?想象一下,你正在尝试反转一个大矩阵,一旦确定它是不可逆的,你就想从这个大计算中解脱出来。把它带到最后是浪费时间。是的,这完全是标准的。但是标准定义了3个使用级别1)传播NaN和infs 2)标志,您可以检查3)软件陷阱。五月