否定浮点数总是安全的

时间:2015-06-12 09:58:52

标签: c++ c floating-point

考虑:

double f = foo();
double g = -f;

其中foo()可以返回分配给f的任何内容。

在C和C ++中是否double g = -f;安全?对于IEEE 754类型,它显然是,但C和C ++不限制浮点实现(与Java不同)。

如果安全,那么-g总是将truefoo()进行比较吗?

(上述情况不适用于2 {3}中的int

1 个答案:

答案 0 :(得分:5)

浮动类型由C标准的§5.2.4.2.2(至少草案N1570)定义:

  

浮点类型的特征是根据描述浮点数的表示的模型和提供有关实现的浮点运算的信息的值来定义的.21)以下参数用于为每个浮点数定义模型浮点类型:

     
      
  • s符号(±1)
  •   
  • b指数表示的基数或基数(整数> 1)
  •   
  • e指数(最小emin和最大emax之间的整数)
  •   
  • p precision(有效数字中的base-b数字数)
  •   
  • fk小于b的非负整数(有效数字)
  •   
     

浮点数(x)由以下模型定义:

     

所以是的,该表达式有点 安全,除非foo返回未指定的“其他类型的浮点数”之一按标准:

  

除了归一化的浮点数(如果x≠0,f1> 0),浮点类型可能包含其他种类的浮点数,例如次正规浮点数(x≠0) ,e = emin,f1 = 0)和非标准化浮点数(x≠0,e> emin,f1 = 0),以及不是浮点数的值,例如无穷大和NaN。

  

实现可以给出零值和不是浮点数(例如无穷大和NaN)的值作为符号或者可以使它们保持未签名。

可能还有其他一些注意事项,但标准中有关于这些类型特征的详细信息。您可以在this publicly available draft中阅读所有相关信息。