在支持IEEE-754 FP算法的C ++实现中,有关从积分类型到浮点类型的转换有哪些保证?
具体来说,将任何整数值转换为任何浮点类型总是定义良好的行为,可能导致值+-inf
?或者是否存在导致未定义行为的情况?
(注意,我不是在询问确切的转换,只是从语言标准的角度来看,执行转换总是合法的)
答案 0 :(得分:3)
IEC 60559(IEEE 754的当前后继标准)使得在所有情况下都能很好地定义整数到浮点转换,如Franck's answer中所讨论的那样,但它是最后一个单词的语言标准。主题。
在基本标准中,C ++ 11第4.9节“浮动积分转换”第2段规定了超出范围的整数到浮点转换的未定义行为。 (报价来自文件N3337,这是最接近官方2011 C ++标准的免费公开版。)
整数类型或无范围枚举类型的prvalue可以转换为浮动的prvalue 点类型。如果可能,结果是准确的。如果转换的值在可以的值范围内 表示但是值不能准确表示,它是实现定义的选择 下一个更低或更高的可表示值。 [注意:如果积分值不能,则会出现精度损失 完全表示为浮动类型的值。 - 尾注] 如果转换的值在外面 可以表示的值范围,行为未定义。如果源类型是bool,则为值 false转换为零,值true转换为一。
强调我的。 C标准用不同的词语表达同样的内容(第6.3.1.4节第2段)。
C ++标准没有讨论C ++实现对提供符合IEC 60559标准的浮点运算的意义。但是,C标准(最接近于C11在线免费提供的是N1570)确实在其附件F中讨论了这一点,并且C ++实现者确实倾向于在C ++出现未指定的内容时转向C作为指导。附件F中没有关于整数到浮点转换的显式讨论,但在F.1p1中有这句话:
由于 所有实数都可以用IEC 60559格式表示负和无穷大 在可表示的值范围内。
将该句与6.3.1.4p2放在一起向我表明,当整数幅度超出可表示有限数的范围时,C委员会意味着进行整数到浮点转换以产生±Inf 。这种解释与IEC 60559指定的转换行为一致,因此我们可以合理地确信这是声称符合附件F的C 的实现。
然而,将 C 标准的任何解释应用于C ++充其量是冒险的; C ++在很长一段时间内还没有被定义为C的超集。
如果您的C ++实现预定义了宏__STDC_IEC_559__
和/或以某种方式和文档符合IEC 60559,则不要使用“关于浮点数学的名称速度“编译模式(默认情况下可能启用),你可以依靠超出范围的转换来产生±Inf。否则,它是UB。
答案 1 :(得分:2)
在第7.4节中,standard IEEE-754(2008)表示它是明确定义的行为。但它与IEEE-754有关,C / C ++实现可以自由地尊重它(参见zwol答案)。
当且仅当发生溢出异常时,应发出溢出异常 目标格式的最大有限数是 如果圆形浮点结果是指数,则超出幅度 范围无限。默认结果应由rounding-direction属性和符号确定 中间结果如下:
A) roundTiesToEven和roundTiesToAway携带所有溢出 ∞ 与中间的标志 结果
b)roundTowardZero携带所有溢出到格式的最大有限数字,带有符号 中间结果。c)中 roundTowardNegative将正溢出带到格式的最大有限数,并携带 负溢出 -∞
d)roundTowardPositive将负溢出带到格式最负的有限数,并且 带有正溢出+ ∞
这4个点的所有情况都为从积分到浮点类型的转换提供了确定性结果。
所有其他情况(无溢出)也很好地定义了IEEE-754标准给出的确定性结果。