C语言格式化I/O函数可否触发浮点异常?返回1是否属于错误?
问题解答
格式化输入输出函数是否允许触发浮点异常
C语言标准没有禁止格式化输入输出函数触发浮点异常。所有库函数除非在标准文档中明确标注不会产生浮点异常,否则都允许在处理浮点相关逻辑时触发符合操作逻辑的异常。
浮点类型与十进制字符串互相转换的过程中,普遍涉及舍入、溢出、精度损失等操作,触发FE_INEXACT、FE_OVERFLOW这类浮点异常是完全符合标准预期的行为。
示例代码返回1是否属于实现错误
不属于实现错误。
你给出的示例中使用%e格式输出1.0f,虽然理论上1.0的科学计数法表示是精确的,但C标准没有强制要求printf的浮点转换逻辑必须规避所有不必要的浮点异常。不同C标准库的浮点转字符串实现逻辑存在差异,部分实现的通用转换算法可能在处理过程中产生中间舍入操作,进而触发FE_INEXACT异常,这种行为是被标准允许的。
你代码中开启STDC FENV_ACCESS的写法符合标准要求,此时检测到的FE_INEXACT异常标记是printf实现的转换逻辑正常产生的,不属于实现缺陷。
内容的提问来源于stack exchange,提问作者pmor
相关产品推荐
相关产品推荐

