转换返回浮点类型的函数的返回值

时间:2010-02-15 20:39:09

标签: c function floating-point

我很难理解文章Cast the return value of a function that returns a floating point type

(1)在

  

如果返回表达式具有与函数不同的类型,则转换就好像通过赋值函数的类型一样,但如果返回表达式仅因为广泛的评估而具有更宽的值,则不需要转换。

什么是“广泛评估”?它试图说什么?

(2)在示例中

float f(float x) {  
  return x * 0.1f;  
}  

float g(float x) {  
  return x * 0.1;  
}  

为什么“允许函数f返回一个比float宽的值,但函数g(使用更大的常量)不是”?

在f()中,x和0.1f都是浮点型,所以我认为x * 0.1f也是浮点型?在g()中,0.1可能被认为是double,因此x * 0.1是double?

(3)这篇文章的道德是什么?

谢谢和问候!

2 个答案:

答案 0 :(得分:2)

函数g返回float类型,它是32位值。 0.1被解释为double,表示表达式x * 0.1返回double。 double是64位值,这将导致缩小转换,以便作为float返回。 x可以安全地转换为double,因为这是从float到double的扩展转换。

答案 1 :(得分:1)

  

(1)在

Conversion as if by assignment to the type of the function is required
     

如果返回表达式有   不同类型的功能,但   如果返回表达式有一个   更广泛的价值只是因为广泛   评价。

     

什么是“广泛评估”?是什么   试着说?

如果声明一个字节变量或常量,它实际上可能在32位平台上存储为DWORD。字节算术也可以实现为32位算术(广泛评估)。它不会导致整数类型出现问题。

  

(2)在示例中

     

float f(float x){return x *   0.1F; }

     

float g(float x){return x * 0.1;   }

     

为什么“允许函数f返回a   值比浮点宽,但函数g   (使用更宽的常数)是   不是“?

这就是当前的C标准所说的:0.1f可以以更宽的格式存储(而不是浮点数),x * 0.1f也可以以更宽的格式进行评估,并且返回运算符不需要执行转换为float并且可以“按原样”返回结果。使用g函数,返回运算符需要执行从double到float的转换。

  

在f()中,x和0.1f都是浮点型   所以我认为x * 0.1f也是浮动的   类型?在g()中,可能认为是0.1   为double,所以x * 0.1是double?

是的,这适用于所有32位编译器(至少我认为:))。但是这篇文章正在处理这个问题。

  

(3)道德的道德是什么   制品

C标准很难学习:)