对于假定的浮点值或双精度值,写0.0,0.0f或.0f而不是简单0更好吗?

时间:2013-01-13 11:15:11

标签: ios objective-c

大家好,所有人都在标题中。该问题尤其适用于所有可能类似NSTimeIntervalCGFloat或任何其他浮点数或双精度变量的值。感谢。

编辑:我要求的是值分配而不是字符串格式。

编辑2:问题实际上是为浮点数分配普通0,或者对于f结尾的任何事物来说,分配最差。

4 个答案:

答案 0 :(得分:23)

基本区别如下:

1.01.是双常数

1.0f是一个浮点常量

如果没有后缀,带有小数的文字(123.0)将被视为双精度浮点数。如果将其分配或传递给单精度变量或参数,编译器将(应该)发出警告。附加f告诉编译器您希望将文字视为单精度浮点数。

答案 1 :(得分:7)

如果你正在初始化一个变量,那就毫无意义了。编译器会为你做所有演员。

float a = 0; //Cast int 0 to float 0.0
float b = 0.0; //Cast 0.0 double to float 0.0 as by default floating point constants are double
float c = 0.0f // Assigning float to float. .0f is same as 0.0f

但如果你在表达中使用这些,那么这很有意义。

6/5 becomes 1
6/5.0 becomes 1.2 (double value)
6/5.0f becomes 1.2 (float value)

答案 2 :(得分:3)

如果您想知道运行代码的目标CPU或它执行的二进制代码是否有任何差异,您可以轻松地将编译代码的命令行之一从XCode复制到命令行,修复缺少的环境变量并添加-S。通过这种方式,您将获得可用于比较的装配输出。如果将所有4个变体放在一个小的示例源文件中,则可以在之后比较生成的汇编代码,即使不熟悉ARM汇编。

从我的ARM装配体验(好吧...... 6年前和海湾合作委员会)我打赌1ct就像对自己进行异或,将其内容刷新为0。

答案 3 :(得分:3)

无论你使用0.0,.0,还是0.0f甚至0f都没有太大的区别。 (有一些关于double和float)你甚至可以使用(float)0。

但是0和一些浮动符号之间存在显着差异。零将始终是某种类型的整数。当您可能需要浮点运算时,这可以强制机器执行整数运算。

我没有一个很好的例子,但是我一般都有一个浮动/整数,其中一天让我疯狂。

我习惯于8位RGB颜色这是因为我作为摄影师的爱好以及我最近作为html开发人员的背景。所以我觉得很难习惯可可风格的0 ..1分红色,绿色和黄色。为了克服这个问题,我想使用我习惯使用的值并将它们除以255.

[CGColor colorWithRed: 128/255 green: 128/255 andYellow: 128/255];

这应该会产生一些不错的中间灰色。但事实并非如此。我试过的所有东西都是黑色或白色。 首先,我认为这是由于我使用这种颜色的UI文本对象的一些无证的无效性造成的。花了一段时间才意识到这个常量值强制整数运算只能向上或向下舍入到0和1。 这次尝试最终实现了我想要实现的目标:

[CGColor colorWithRed: 128.0/255.0 green: 128.0/255.0 andYellow: 128.0/255.0];

你可以用更少的.0s来实现同样的目标。但是,如果需要的话,不要伤害他们。 128.0f /(float)255也可以。

编辑以回复“Edit2”:

float fvar; 
fvar = 0; 

vs ...

fvar = .0;

最后它根本没有任何区别。 fvar将包含接近(但不总是等于)0.0的浮点值。对于60和70日的编译器,我猜想有一个与fvar = 0相关的轻微性能问题。也就是说,编译器首先创建一个int 0,然后在赋值之前必须将其转换为float。今天的现代编译器应该比旧版本更好地自动优化。最后,我必须查看机器代码输出,看它是否确实有所作为。 但是,使用fvar = .0;,您始终在安全的网站上。