gpt4 book ai didi

floating-point - 哪些语言向开发人员公开了 IEEE 754 陷阱?

转载 作者:行者123 更新时间:2023-12-04 04:32:44 25 4
gpt4 key购买 nike

为了教育目的,我想玩这些陷阱。

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

有时我们有办法对这种事件使用react:延长函数(“在我的情况下为 0/0 = 12”),或者在时域模拟中放弃步骤并尝试其他设置(如预测器、步骤大小或其他)。

所以这是我的问题:您知道将 IEEE754 陷阱暴露给开发人员的语言吗?我不想为此与 ASM 搞混。

最佳答案

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

首先,如果您禁用/屏蔽浮点异常(大多数环境默认这样做),您可以通过调用 fetestexcept 查看是否发生任何浮点异常。 . fetestexcept 在 Visual C++ 中不可用,但您可以很容易地窃取 MinGW 运行时的实现。 (它在公共(public)领域。)一旦标记了异常,在调用 feclearexcept 之前它不会被清除,因此您可以在一系列计算结束时调用 fetestexcept 以查看其中是否有任何引发异常。这不会为您提供您要求的陷阱,但它确实可以让您测试是否发生了诸如 NaN 或 +/-inf 之类的问题并根据需要使用react。

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

  • 在 Linux 中,操作系统会发送一个 SIGFPE 信号,因此您可以安装一个信号处理程序来捕获它并设置一个标志来告诉您的例程做出适当的 react 。
  • 在 Windows 中,操作系统调用结构化异常处理来将处理器异常转换为可以使用 __try 捕获的语言异常。/__catch C 或 try 中的 block /catch C++ 中的 block 。
  • 更新:对于 Mac OS X,如 this answer 中所述,您应该能够使用 _MM_SET_EXCEPTION_MASK 启用/取消屏蔽异常来自 xmmintrin.h ,并且只要您使用默认编译器选项(即不禁用 SSE),您应该能够使用 SIGFPE 捕获异常。

  • (如果你好奇的话,我已经在 this blog posting 中写了更多关于 C 和 C++ 中的这个和其他浮点问题的文章。)

    关于floating-point - 哪些语言向开发人员公开了 IEEE 754 陷阱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/699078/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com