2010-09-12 477 views
9

我对将f放在字面值旁边有一些疑问。我知道它将其定义为float,但我真的需要它吗? 这是2.0f * 2.0f更快或编译任何不同于2.0 * 2.0?像float a = 2.0;这样的陈述与float a = 2.0f;的编译方式不同吗?2.0和2.0f之间的区别(显式浮点数和双字面值)

+3

你的意思是“文字值”,而不是“变量名”。 '2.0'是一个'double'字面值。 '2.0f'是一个'float'字面值。 '2'是一个'int'字面值。这些都不是变数。 – RBerteig 2010-09-12 22:30:23

+0

@RBerteig我的坏:) – 2010-09-12 22:33:01

+0

对不起,并不意味着听起来像我在那里咆哮......我可能应该静静地编辑尸体。 – RBerteig 2010-09-12 22:44:47

回答

19

有时你需要明确有型float,如以下情况

float f = ...; 
float r = std::max(f, 42.0); // won't work; (float, double). 
float r = std::max(f, 42.0f); // works: both have same type 
6

我很少关于速度(至少直接),但事实上否则编译器会警告将double转换为float

+0

好吧,但在a * 2.0的例子是真的使用双倍? – 2010-09-12 22:25:30

+2

从理论上讲,我认为这应该会导致两个'double'的乘法,即将结果转换为'float'。实际上,在2.0的情况下,编译器可能/会发现它可以在整个过程中使用'float'。 OTOH,在优化FP数学方面有强制性的限制(特别是在C99中),所以明确规定可以提供帮助。 – 2010-09-12 22:29:45

+0

是的我只是用2.0作为例子。谢谢您的帮助。 – 2010-09-12 22:34:44

3

据我所知,在“正常”的PC(X86与x87般的数学协处理器),在速度上的差异是无关紧要的,因为无论如何,这些计算都是以80位精度完成的。

当您需要管理大量浮点数字(科学计算或类似的东西)时,浮点数可能会变得很重要,因此使用较小的数据类型可能会很方便,既可以使用更少的内存,也可以更快地读取他们从RAM /磁盘。

在缺乏浮点单元的机器(例如大多数微控制器)上使用浮点数而非双精度浮点数也是有用的,其中所有的浮点算术运算都是由编译器插入的代码在软件中执行的;在这种情况下,运行在浮点上的速度可能会有所增加(并且在这样的环境中,往往也是每一点存储都很重要)。

在PC上,IMO可以在“正常”上下文中使用double,只是为了避免在同一表达式中混合使用数据类型(double,float,ints,...)以避免不必要的昂贵转换。无论如何,使用文字编译器应该足够聪明,可以在编译时执行转换。

+0

是的,我正在使用iphone。 – 2010-09-12 22:34:04

+0

由于我读过,iPhone处理器是一个ARM1176,并提供了可选的FPU(请参见:http://www.arm.com/products/processors/technologies/vector-floating-point.php);我不是这方面的专家,但我不认为在这种情况下,花车/双打的速度变化很大。我唯一担心的是它有“16个双精度或32个单精度寄存器”,所以只使用浮点数可以从附加寄存器中获得一些东西,但也可能取决于环境的设置方式。 – 2010-09-12 22:37:02

+0

嗯,我知道你可以,但在iPhone双重肯定是慢的然后浮动。 – 2010-09-12 22:39:15