gpt4 book ai didi

c - 运算符 ≤ UB 是否用于浮点比较?

转载 作者:行者123 更新时间:2023-11-30 18:17:29 25 4
gpt4 key购买 nike

关闭。这个问题需要details or clarity .它目前不接受答案。












想改进这个问题?通过 editing this post 添加详细信息并澄清问题.

6年前关闭。




Improve this question




关于这个主题有很多引用资料(herehere)。但是,我仍然无法理解为什么以下内容不被视为 UB 并且由我最喜欢的编译器(插入 clang 和/或 gcc)正确报告并带有简洁的警告:

// f1, f2 and epsilon are defined as double
if ( f1 / f2 <= epsilon )

根据 C99:TC3, 5.2.4.2.2 §8:我们有:

Except for assignment and cast (which remove all extra range and precision), the values of operations with floating operands and values subject to the usual arithmetic conversions and of floating constants are evaluated to a format whose range and precision may be greater than required by the type. [...]



使用典型编译 f1 / f2将直接从 FPU 读取。我在这里尝试过使用 gcc -m32 ,使用 gcc 5.2。所以 f1 / f2是(在此处)在 80 位上(只是猜测此处没有确切的规范)浮点寄存器。这里没有类型提升(根据标准)。

我也测试过 clang 3.5 , 这个编译器似乎转换了 f1 / f2 的结果回到正常的 64 位浮点表示(这是实现定义的行为,但对于我的问题,我更喜欢默认的 gcc 行为)。

据我了解,将在我们不知道大小的类型(即 format whose range and precision may be greater )和 epsilon 之间进行比较。其大小正好是 64 位。

我真正难以理解的是 平等 与众所周知的 C 类型(例如 64 位 double )和某些东西 whose range and precision may be greater 进行比较.我会假设在标准中的某个地方需要某种提升(例如,标准将要求 epsilon 将提升为更广泛的浮点类型)。

所以唯一合法的语法应该是:
if ( (double)(f1 / f2) <= epsilon )

要么
double res = f1 / f2;
if ( res <= epsilon )

作为旁注,我希望文献仅记录 operator < ,在我的情况下:
if ( f1 / f2 < epsilon )

因为总是可以使用 operator < 比较不同大小的浮点数。 .

那么在哪些情况下第一个表达式是有意义的呢?换句话说,标准如何在具有不同大小的两个浮点表示之间定义某种相等运算符?

编辑:这里的整个困惑是我认为可以比较两个不同大小的浮点数。这不可能发生。 (感谢@DevSolar!)。

最佳答案

<=对于所有可能的浮点值都是明确定义的。

但是有一个异常(exception):至少有一个参数未初始化的情况。但这更多地与读取未初始化的变量 UB 有关;不是 <=本身

关于c - 运算符 ≤ UB 是否用于浮点比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32522358/

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