是否允许格式化输入/输出函数引发浮点异常?

Posted

技术标签:

【中文标题】是否允许格式化输入/输出函数引发浮点异常?【英文标题】:Is it allowed for formatted input/output functions to raise floating-point exceptions? 【发布时间】:2022-01-08 21:17:10 【问题描述】:

示例代码(t0.c):

#include <stdio.h>
#include <fenv.h>

int main(void)

    printf("%e\n", 1.0f);
    
#pragma STDC FENV_ACCESS ON
        return fetestexcept(FE_INEXACT) ? 1 : 0;
    

如果返回1,那么是不是报错了?

【问题讨论】:

为什么不呢?如果你传递了一个陷阱表示会发生什么? 因为从概念上讲如何将输出写入流会导致浮点异常?回复:如果你通过了一个陷阱表示:UB? 仅仅访问一些值leads to undefined behavior: "某些对象表示不需要表示对象类型的值。如果对象的存储值具有这样的表示并且被一个左值表达式读取没有字符类型,行为未定义。” printf 内部的某处必须将二进制数转换为十进制数。这需要大量的浮点运算。是否有理由认为库程序员可以编写代码,使其无论输入如何都不会引发异常? @NateEldredge 我正在考虑在格式化输入/输出函数的进入/退出时禁用/启用或保存/恢复 FP 异常。 【参考方案1】:

是的。

更多:不仅仅是“允许”,而是“必需”。

IEEE 754-2019, 5.12.2:

如果需要四舍五入,他们应使用正确的四舍五入,并正确表示不精确和其他异常。

ISO/IEC 9899:202x (E) 工作草案 - 2020 年 12 月 11 日 N2596,附录 F.5:

如果任一转换不精确,则引发(一次)“不精确”浮点异常。392)(第二次转换可能引发“上溢”或“下溢”浮点异常。)

本子条款中的规范确保 IEC 60559 二进制格式和十进制字符序列之间的转换遵循所有相关的推荐做法。

【讨论】:

以上是关于是否允许格式化输入/输出函数引发浮点异常?的主要内容,如果未能解决你的问题,请参考以下文章

c语言关于八进制 十六进制 浮点型输入输出格式符的寻找

c语言关于八进制 十六进制 浮点型输入输出格式符的寻找

格式化输出py

蓝桥算法训练 求平方和 ALGO-239

c++输入输出流

python输出格式化及函数format