C 1.0f和1.0的区别在哪里?
在研究视频压缩编码器时,我遇到了float rateRatio=1.0f。我想知道这有什么不同我是说1.0f和1.0 一个是C 1.0f和1.0的区别在哪里?,c,C,在研究视频压缩编码器时,我遇到了float rateRatio=1.0f。我想知道这有什么不同我是说1.0f和1.0 一个是double另一个是float: double x = 0.0; // denotes a double float y = 0.0f; // denotes a float 这取决于系统,但例如在Windows上,您会发现float的精度为32位,而double的精度为64位。当涉及到精确或可计算的不稳定计算时,这可能会产生巨大的差异。正如其他人所说,一个文本类型为
double
另一个是float
:
double x = 0.0; // denotes a double
float y = 0.0f; // denotes a float
这取决于系统,但例如在Windows上,您会发现
float
的精度为32位,而double
的精度为64位。当涉及到精确或可计算的不稳定计算时,这可能会产生巨大的差异。正如其他人所说,一个文本类型为float
,另一个类型为double
。
下面是一个例子,说明了这一点:
#include <stdio.h>
int main(void)
{
int a = 16777217 * 1.0f;
int b = 16777217 * 1.0;
printf("%d %d\n", a, b);
}
表达式16777217*1.0f
属于float
类型,16777217
不能在float
中精确表示(在IEEE-754中),而可以在double
中精确表示
我们可以不写float y=0.0吗
从你的评论中,我看到了困惑的根源。这里重要的不是指定给的变量的数据类型,而是文字常量(0.0、1.0f、1.0等)本身的数据类型。当你写作时
float f = 1.0;
1.0
类型为double
的文本,而f
是一个float
,因此编译器将隐式缩小转换为float
,这同样适用于double d=1.0f
,它将隐式转换从float
扩大到double
原因是16777217*1.0f
表达式(在ouah的回答中)变成了float
,因为1.0f
是float
,并且在同时包含float
和int
的表达式中,结果类型由标准指定为float
,因此两者都转换为float
s,但是结果值不能表示为浮点值
,因此您会看到不同的值
相反,当
1.0f
更改为1.0
时,它将成为double
,因此16777217*1.0
表达式将成为double
(同样,因为标准规定,在具有double和任何其他整数类型的表达式中,结果是double
)它的大小足以容纳值16777217
它的可能重复在不涉及双类型的表达式中产生差异:1.0f是float类型,因此它使用float而不是double来计算表达式,这可能更快在float rateRatio=1.0f
中后缀是无用的,因为该值被分配给了float
。它不是重复的,所以问题不在于1.0f
和1.0
之间有什么区别,而是它在哪里产生了区别。参见我的答案。在我的文章中,我介绍了一些有趣的案例。@PRAVINPAWAR在double
和float
之间有一个隐式转换,但是如果编译器不能在编译时计算它,它将是一个运行时强制转换。@PRAVINPAWAR参见ouah的答案
float f = 1.0;