C 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位。当涉及到精确或可计算的不稳定计算时,这可能会产生巨大的差异。正如其他人所说,一个文本类型为

在研究视频压缩编码器时,我遇到了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位。当涉及到精确或可计算的不稳定计算时,这可能会产生巨大的差异。

正如其他人所说,一个文本类型为
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;