使用IEEE FP进行浮点转换的整数

时间:2016-11-19 15:08:19

标签: c++ ieee-754

在支持IEEE-754 FP算法的C ++实现中,有关从积分类型到浮点类型的转换有哪些保证?

具体来说,将任何整数值转换为任何浮点类型总是定义良好的行为,可能导致值+-inf?或者是否存在导致未定义行为的情况?

(注意,我不是在询问确切的转换,只是从语言标准的角度来看,执行转换总是合法的)

2 个答案:

答案 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标准给出的确定性结果。