浮点运算是否会导致 IEC 559/IEEE 754 浮点类型的无限未定义行为

2023-11-21

我正在读无穷大不是 constexpr,这似乎表明创建无穷大是未定义的行为:

[expr]/4:

如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。

然而,如果std::numeric_limits::is_iec559equal true,似乎给了我们更多的保证。

下面的代码利用此保证来创建无限数量。当执行时constexpr上下文,它会导致编译器失败,因为这是undefined behavior以防万一is_iec559等于假。

// clang++ -std=c++17 -O3
#include <limits>

constexpr double createInfinity()
{
    static_assert(std::numeric_limits<double>::is_iec559, "asdf");
    double d = 999999999999;
    while (d != std::numeric_limits<double>::infinity())
    {
        d *= d;
    }
    return -1*d;
}

static_assert(createInfinity() == std::numeric_limits<double>::infinity(), "inf");

编译器资源管理器中的代码

由于此函数始终导致无穷大,因此永远无法在有效的 C++ 程序中调用它。然而,正如我们所断言的is_iec559,我们得到额外的保证。这个程序还无效吗?

  • 如果无效?拥有有什么意义is_iec559?
  • 如果有效?为什么它在运行时有效而不是在 constexpr 上下文中有效?

(答案可以同时使用C++17和即将推出的C++20,请明确指出使用哪一个)


等待一段时间有时会有所帮助,看起来 Clang 已经收到了一个补丁,可以使此代码编译:https://reviews.llvm.org/D63793

在r329065之前,我们使用[-max, max]作为可表示的范围 值,因为 LLVM 的 fptrunc 不保证定义的行为 从较大的浮点类型截断为较小的浮点类型。现在 已修复,我们可以让 clang 遵循正常的 IEEE 754 语义 取较大范围[-inf,+inf]作为可表示的范围 价值观。

值得注意的一个有趣的元素(该修订版中的部分代码注释)是,导致 NaN 的操作(尚)是不允许的:

// [expr.pre]p4:
//   If during the evaluation of an expression, the result is not
//   mathematically defined [...], the behavior is undefined.
// FIXME: C++ rules require us to not conform to IEEE 754 here.

编译器资源管理器中的示例:

#include <limits>

constexpr double createNan()
{
    static_assert(std::numeric_limits<double>::is_iec559, "asdf");
    double d = std::numeric_limits<double>::infinity() / std::numeric_limits<double>::infinity();
    return -1*d;
}

static_assert(createNan() != 0., "NaN");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浮点运算是否会导致 IEC 559/IEEE 754 浮点类型的无限未定义行为 的相关文章

随机推荐

  • 在 Xcode 6 beta 5 中使用 += 时,'[(UIView)]' 与 'UInt8' 不同。使用追加方法?

    我正在使用 将 UIView 指向数组 但这似乎不再起作用 线路 dropsFound hitView 给出错误 UIView 与 UInt8 不同 这是该方法的一部分 请注意 从 Xcode 6 beta 5 开始 hitTest 现在返
  • iOS 多任务处理中进入后台时线程的行为

    在运行一些测试时 我注意到当应用程序 没有后台权限 即 voip gps 等 进入后台状态时 当时运行的任何后台线程 或并发 NSOperations 似乎都会暂停 未终止 当应用程序进入前台时 它们会继续 我在任何地方都看不到这个线程行为
  • 如何在 Linux shell 中使用正则表达式从文件中提取 IP 地址?

    如何在Linux shell中通过正则表达式提取文本部分 比方说 我有一个文件 其中每一行都是一个 IP 地址 但位置不同 使用常见的 UNIX 命令行工具提取这些 IP 地址的最简单方法是什么 你可以使用grep把他们拉出来 grep o
  • 在不创建项目的情况下使用 eclipse CDT

    我目前正在学习 c 我的第一语言是 python 我习惯在 pydev 中的 eclipse 中编码 我通过编写大量代码片段来学习语言 并广泛使用调试器来了解实际发生的情况 现在 我下载了 CDT for eclipse 因为我已经习惯了这
  • Flutter - 如何在streambuilder中使用await?

    我想在streambuilder 中使用await 但是 如果您在内部使用 async 则会出现错误 在下面的代码中 这就是我想要解决的部分 如果我能告诉你如何做的话 非常感谢 class MemoStreamState extends S
  • GKGraphNode costToNode 方法的子类永远不会被调用

    我正在尝试对 GKGraphNode2D 进行子类化 以包含针对不同地形的不同惩罚 在 costToNode 方法中 当我使用新子类的数组创建新的 GKGraph 并在 GKGraph 上调用 findPathFromNode 时 它 完全
  • erlang 中的 is_proplist 吗?

    如何获取列表的类型 如果列表是 proplist 我想执行代码 让我们说L a 1 b 2 c 3 列表是L吗 我将它转换为proplist 就像 L a 1 b 2 c 3 如何判断列表是否是 proplist erlang is lis
  • 通过 Coldfusion 中的 cfset 进行长/多行内容

    有没有一种方法可以使用 cfset 设置变量 其作用更像 cdata 标签 或者是否有另一种方法可以让页面设置一些基本变量并为主要内容设置几个较长的变量 ie
  • 在量角器测试中,有没有一种方法可以在测试运行之间等待

    在量角器中 有没有一种方法可以在每次测试运行之间添加显式等待 这与Java中的Thread sleep具有相同的效果 您可以在调试模式下启动量角器 run protractor debug debugging yourConfigFile
  • Rails 没有使用我的全局 Ruby 版本

    我想将 Rails 与 Ruby 2 1 0 一起使用 但它使用的是 Ruby 1 9 3 系统版本 我在用着rbenv管理我的 Ruby 版本 我的步骤大致如下 rbenv install 2 1 0 rbenv global 2 1 0
  • 使用谷歌电子表格脚本复制并粘贴

    我想修改下面显示的脚本 这样如果重新运行 它不会覆盖预先存在的数据 而是写入其下的行 我使用谷歌电子表格 moveValuesOnly fonction var ss SpreadsheetApp getActiveSpreadsheet
  • 在 Github 上发布项目版本(二进制/源代码包)?

    Does Github提供为项目创建发布页面的选项吗 我注意到它可以让您为源创建不同的标签 但找不到可以添加发行说明 构建包等的 UI web 更新日期 2013 年 7 月 2 日 你现在可以定义一个版本 Releases 将软件交付给最
  • jquery.on 滚动不起作用

    我正在尝试构建一个 DOM 事件记录器 以便可以回放用户如何与页面交互 我想使用 jquery on 功能 这样我就可以记录页面上的所有事件 在这个特定的实例中 我试图记录滚动事件 但最终我想记录各种事件 这是我的 JS Fiddle 的链
  • 仅 ONE VIEW 横向模式

    我完成了我的 iOS 应用程序 但我只需要将一个视图设置为横向模式 其余视图只能在纵向模式下看到 我使用的是 Xcode 5 1 并且通过从右侧面板放入故事板视图控制器来创建所有视图 因此 如果您要告诉我在某处编写一些代码 请准确地告诉我需
  • 如何根据 Javadoc 警告使 gradle 构建失败

    我正在使用 Java 7 尽管使用 1 6 进行编译 来编译类和 javadocs 我已经消除了出现的所有 javadoc 警告 但想法是如果存在任何 javadoc 警告 则构建失败 使用 Java 8 这是默认行为 但是 它在警告方面也
  • 对于使用本机反应的 Instagram 登录,Redirect_uri 无效

    我在用react native instagram login对于反应本机 这是我的代码
  • UIForm 与 prependId="false" 中断

    我对事实背后的想法有疑问 只有UIForm得到了属性prependId 为什么属性中没有指定NamingContainer界面 您现在可能会说这是因为向后兼容性 但我更愿意打破兼容性并让实现该接口的用户也实现 prependId 事物的方法
  • 构建 NHibernate DTO 的最佳方法

    我是 NHibernate 和 ORMS 的新手 并试图掌握它提供的无数不同选项 作为参考 我使用 Fluent NHibernate 和单独的业务对象 这些对象又使用 DTO 纯粹用于数据访问 我的应用程序架构必须同时支持 Windows
  • 用Python实现堆栈

    我正在尝试使用数组用 Python 实现一个简单的堆栈 我想知道是否有人能让我知道我的代码有什么问题 class myStack def init self self def isEmpty self return self def pus
  • 浮点运算是否会导致 IEC 559/IEEE 754 浮点类型的无限未定义行为

    我正在读无穷大不是 constexpr 这似乎表明创建无穷大是未定义的行为 expr 4 如果在计算表达式期间 结果未在数学上定义或不在其类型的可表示值范围内 则行为未定义 然而 如果std numeric limits is iec559