在C语言中,初始化时使用0.0f的意义是什么?

44

我看到过人们这样初始化浮点变量的代码:

float num = 0.0f;

这样做与仅执行下面的操作之间是否有显着差异?

float num = 0; 
谢谢.. :)

3
许多重复的问题,例如"f"在Objective-C/C中表示数字或浮点数后面的含义 - Paul R
1
他们可能漏掉了f。被咬过一次,下次会谨慎。 - Hans Passant
7个回答

63

float x = 0 中的 int 会被隐式转换为 float 类型。
float x = 0.0f 不需要进行类型转换。
float x = 0.0 中的 double 会被隐式转换为 float 类型。

根据编译器的不同,隐式类型转换可能需要编译器生成额外的代码。


7
如果您的编译器在运行时进行类型转换,那么您将面临比额外类型转换更大的性能问题。唯一的例外是当精确浮点方案可在运行时选择时,在这种情况下编译器无法确定正确的类型转换是什么(尽管在这种情况下很明显)。 - David Thornley
1
是的,我上次看到这个问题是在 Vax C 编译器上。 - EvilTeach
增加可执行程序的大小(稍微)? 这不是4k可执行文件竞赛选手会认为可以接受的事吧。 - bobobobo
我认为“推广”是正确的术语,而不是“类型转换”。所有编译器都必须这样做,而不仅仅是VAX C。 - EvilTeach

10
可能的原因是他们曾经写了类似以下的一些内容:
float f = 1 / i; // i an integer

在调试过后,他们发誓要始终充分地装饰字面量以获得正确的类型:

float f = 1.0f / i;
在这种情况下,.0 的作用是确保除法为浮点除法,而不是整数除法。f 的原因是因为没有必要使用 double 进行操作。我认为更有可能的实现情况是,1.0/i 没有任何好处但会显著降低速度(软件浮点模拟、无关紧要的优化),而不是 1.0f 没有任何好处但会显著降低速度(如果 double 比 float 更快,那是因为你有 fp 硬件,所以两者之间的转换将非常快,不会引入显著的减速)。

一旦你养成了给字面量加修饰的习惯,你很可能会写出以下代码:

float f = 0.0f;
即使它与 float f = 0.0;float f = 0; 具有完全相同的效果,但使用它仍然是可行的。

当然,作者可能并没有亲身经历这个领悟,他们可能只是继承了其他人的风格。

我只会写 0

R..在评论中指出另一个答案,即写0还具有这样的好处:当你将来更改 f 的类型时,你不必更新字面量以匹配。如果赋值与定义分开,则更改:

float f = something
// some time later
f = 0.1f;

发送给:

double f = something;
// some time later
f = 0.1f;

可能是一个bug。最好使用0.1并让编译器在必要时截断为float。你可能会认为使用float本身就是一种优化,无论是时间还是空间方面,处理float和double之间的任何差异的负担应该被视为执行该优化的开发者成本。


7

在IT技术中,初始化变量时最好使用相同类型的字面常量。在这种情况下,您有一个浮点变量,应该使用浮点字面常量进行初始化,即0.0f,而不是整数(0),后者会被隐式转换为浮点型。


4

严格来说,0是一个整数,因此float num = 0需要将整数转换为浮点数。但我想编译器会自动为您执行此操作。我猜人们使用0.0f是为了强调这是一个浮点数,以免被误认为是整数。


4

'f'表示您想要一个浮点数 :

0是int类型

0f是float类型

0.0是double类型

0.0f是float类型


3

Paul R已经写了答案。你的第二个例子有一个整数初始化值。

你应该始终使用与正在初始化的变量相同类型的初始化器。这避免了编译时(理想情况下)或运行时(懒惰编译器:有这样的吗?)的任何转换。而且更重要的是,转换在一般情况下可能会导致一些奇怪的事情发生。

在这里,转换应该做到预期的效果,但这仍然是良好的风格并避免了编译器警告。


1

我不认为在初始化过程中使用这个有任何理由。但是,在涉及浮点字面量的操作中,这将非常有用。例如;

float a=0.43, b;
b = 0.5*a + 2.56*a*a;

没有后缀的浮点字面量被视为双精度。因此,在这个计算中,“a”将被强制转换为double,RHS评估的最终答案将是double。在赋值过程中,RHS的double值被强制转换为float并赋给“b”。如果机器没有双精度FPU,则会降低性能。为了避免这种情况并在整个计算中使用float,需要使用后缀。例如,
float a=0.43, b;
b = 0.5f*a + 2.56f*a*a;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接