40

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

float num = 0.0f;

这与仅执行以下操作之间有显着区别吗?

float num = 0; 

谢谢.. :)

4

7 回答 7

60

float x = 0具有从 int 到 float 的隐式类型转换。
float x = 0.0f没有这样的类型转换。
float x = 0.0具有从 double 到 float 的隐式类型转换。

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

于 2011-03-04T21:31:58.080 回答
9

可能原因是他们曾经写过类似的东西:

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;即使它与or具有完全相同的效果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;

可能是一个错误。0.1如有必要,最好使用并让编译器截断以浮动。您可能会争辩说 usingfloat根本就是一种优化,如果不是为了时间,也是为了空间,处理 float 和 double 之间的任何差异的负担应该算作执行该优化的开发人员成本。

于 2011-03-04T22:22:11.707 回答
8

用相同类型的字面常量初始化变量只是一种好的做法。在这种情况下,你有一个浮点变量,你应该用一个浮点字面常量来初始化它,即0.0f,而不是一个 int ( 0),然后隐式转换为一个浮点数。

于 2011-03-04T21:20:18.193 回答
3

好吧,严格来说,0 是一个整数,因此float num = 0需要从整数转换为浮点数。但我想编译器无论如何都会为你做这个。我猜人们使用0.0f它是为了强调这是一个浮点数,所以没有人将它误认为是一个整数。

于 2011-03-04T21:18:33.627 回答
3

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

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

这里的转换应该完全符合预期,但它仍然是很好的风格并且避免了编译器警告。

于 2011-03-04T21:20:15.110 回答
2

'f' 表示你想要一个 float :

0 是一个整数

0f 是一个浮点数

0.0 是双倍

0.0f 是一个浮点数

于 2018-04-19T15:39:05.553 回答
1

我看不出有任何理由将其用于初始化过程。但是,对于涉及浮点文字的操作,这将很有用。例如;

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

没有后缀的浮点文字被认为是双精度。因此,对于这个计算,“a”将被强制转换为双精度,而 RHS 评估的最终答案将是双精度。在赋值过程中,RHS 的双精度值被强制转换为浮点数并赋值给“b”。如果机器没有双精度 FPU,这会降低性能。为了避免这种情况并使用浮点数进行整个计算。使用后缀。例如,

float a=0.43, b;
b = 0.5f*a + 2.56f*a*a;
于 2011-03-04T22:42:52.453 回答