1.0f和1.0在哪里有所不同?

时间:2014-08-20 11:18:32

标签: c

在研究视频压缩编码器时,我遇到了float rateRatio = 1.0f。我想知道它在哪里有所不同我的意思是1.0f和1.0?

3 个答案:

答案 0 :(得分:14)

正如其他人所说,一个文字的类型为float,另一个文字的类型为double。 这是一个有所作为的例子:

#include <stdio.h>

int main(void)
{
    int a = 16777217 * 1.0f;
    int b = 16777217 * 1.0;

    printf("%d %d\n", a, b);
}

在我的机器上打印:

16777216 16777217

表达式16777217 * 1.0f的类型为float16777217无法在float(IEEE-754)中精确表示,而它可以在{{ {1}}。

答案 1 :(得分:6)

一个是double,另一个是float

double x = 0.0  // denotes a double
float y  = 0.0f // denotes a float

这取决于系统,例如在Windows上,您会发现float的精度为32位,而double的精度为64位。当涉及精确或可数值的不稳定计算时,这会产生巨大的差异。

答案 2 :(得分:4)

  

我们不能写float y = 0.0

从你的评论中,我看到了混乱的起源。它不是分配给变量的数据类型,而是文字常量(0.0,1.0f,1.0等)本身的数据类型。当你写

float f = 1.0;

1.0类型为double的字面值而ffloat,因此编译器执行隐式缩小转换为float,同样适用double d = 1.0f的{​​{1}}隐式转换从float扩展到double

Implicit conversion rules16777217 * 1.0f表达式(在 ouah 的答案中)成为float的原因,因为1.0f是{{1}在包含floatfloat的表达式中,结果类型由标准规定为int,因此两者都转换为float s,但结果值不能表示为float,因此您会看到不同的值。

相反,当float更改为1.0f时,它变为1.0,因此double表达式变为16777217 * 1.0(同样,因为标准规定了double使用double和任何其他整数类型的表达式,结果为double),其大小足以容纳值16777217