在研究视频压缩编码器时,我遇到了float rateRatio = 1.0f。我想知道它在哪里有所不同我的意思是1.0f和1.0?
答案 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
的类型为float
而16777217
无法在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
的字面值而f
为float
,因此编译器执行隐式缩小转换为float
,同样适用double d = 1.0f
的{{1}}隐式转换从float
扩展到double
。
Implicit conversion rules是16777217 * 1.0f
表达式(在 ouah 的答案中)成为float
的原因,因为1.0f
是{{1}在包含float
和float
的表达式中,结果类型由标准规定为int
,因此两者都转换为float
s,但结果值不能表示为float
,因此您会看到不同的值。
相反,当float
更改为1.0f
时,它变为1.0
,因此double
表达式变为16777217 * 1.0
(同样,因为标准规定了double
使用double和任何其他整数类型的表达式,结果为double
),其大小足以容纳值16777217
。