【发布时间】: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 异常。
标签: c floating-point printf language-lawyer c11