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

PRA*_*WAR 5 c

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

oua*_*uah 15

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

#include <stdio.h>

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

    printf("%d %d\n", a, b);
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上打印:

16777216 16777217
Run Code Online (Sandbox Code Playgroud)

表达式16777217 * 1.0f是类型的float,16777217不能精确地表示在float(在IEEE-754中),而它可以精确地表示在a中double.


dis*_*ame 7

一个是double另一个是float:

double x = 0.0;  // denotes a double
float y  = 0.0f; // denotes a float
Run Code Online (Sandbox Code Playgroud)

这取决于系统,但在Windows上你会发现它float具有32位精度而double64位.当涉及精确或可数字的不稳定计算时,这可以产生巨大的差异.


leg*_*s2k 5

我们不能写浮点y = 0.0

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

float f = 1.0;
Run Code Online (Sandbox Code Playgroud)

1.0类型的文字double,同时f是一个float,因此,编译器执行一个隐含的收缩转换到float,这同样适用于真double d = 1.0f在那里它从扩大的隐式转换floatdouble

隐式转换规则16777217 * 1.0f表达式(在ouah的回答中)成为a的原因float,因为1.0fa是a,float并且在具有两者的表达式中,float并且int结果类型由标准规定为a float,因此两者都转换为floats,但是结果值不是不能表示为a float,因此您会看到不同的值。

取而代之的1.0f是,将when 更改为1.0a double,从而使16777217 * 1.0表达式变为a double(同样,因为该标准指示在具有double和任何其他整数类型的表达式中,结果为a double),足以容纳该值16777217