为什么Android API中有这么多浮动?

时间:2010-03-19 06:56:41

标签: android floating-point dalvik

Java中的默认浮点类型是double。如果您将类似2.5的常量硬编码到程序中,Java会自动将其设置为double。当您对可能从更高精度中受益的浮点数或整数执行操作时,类型将“提升”为双精度。

但是在Android API中,一切似乎都是从声音音量到矩形坐标的浮动。在大多数绘图中都使用了一个名为RectF的结构; F代表浮动。对于那些经常将提升双打回到(float)的程序员来说,这真的很痛苦。难道我们都不同意Java代码是如此混乱和冗长吗?

通常,数学协处理器和加速器在Java中更喜欢双重,因为它对应于一种内部类型。有没有关于Android的Dalvik VM出于某些原因更喜欢花车?或者所有的浮点数都只是API设计变态的结果?

5 个答案:

答案 0 :(得分:43)

在没有FPU的设备上,单精度浮点运算比双精度运算符快得多。因此,Android框架提供了一个FloatMath类,它复制了一些java.lang.Math函数,但是使用了float参数而不是double。

在最近的带有FPU的Android设备上,单精度和双精度操作所需的时间大致相同,并且明显快于软件实现。 (“为性能设计”页面是为G1编写的,需要更新以反映各种变化。)

顺便说一句,写“2.5f”或“(浮动)2.5”并不重要。无论哪种方式,javac都知道你想要一个单精度浮点常数,这就是它产生的。您可以通过编写示例程序并检查生成的字节码来验证这一点。

答案 1 :(得分:8)

根据CPU的不同,不会有浮点单元(FPU)。因此它必须模拟软件中的FPU。对于Float而言,这比Double更快。或者,如果设备具有FPU,则Floats可能也会更快。

答案 2 :(得分:7)

对于不需要太多有效数字的指标(例如屏幕偏移),使用double而不是float s会降低内存效率。在移动设备上,最大限度地提高内存消耗效率至关重要,因为几乎所有资源都非常宝贵。并且,当处理可能由数千个分配的Rect s之类的对象时 - 减少多余的比特显然是至关重要的。

我确信还有其他原因: - )

答案 3 :(得分:3)

怪异。在指南中设计性能似乎说“......桌面系统的常见做法是自由使用浮点......所以”浮动“和”双“的所有操作都在软件中执行...... 。“http://developer.android.com/guide/practices/design/performance.html#avoidfloat

这可能有些道理: “....指令不是无条件地限于特定类型。例如,在没有解释的情况下移动32位寄存器值的指令不必指定它们是移动整数还是浮点数......” 在http://www.netmite.com/android/mydroid/dalvik/docs/dalvik-bytecode.html

答案 4 :(得分:1)

我认为Roman是正确的,原因可能主要是为了减少内存使用量。考虑到当最终精度不重要时,你将把数值变量所需的内存减半。

请记住,没有必要使用铸造。只需将F附加到您的文字(因此2.5变为2.5f)。我不知道编译器是否足够聪明,可以为您执行以下替换,但如果没有,这将使您的代码稍微提高效率。

考虑

float x = (float) 2.5;

float x = 2.5f;

在第一种情况下,在运行时,程序存储一个double,然后执行转换操作,然后存储生成的浮点值。在第二种情况下,编译器会将值识别为float,因此在运行时您可以避免存储double(但可能是暂时的)并且还避免了强制转换操作(因为它已经存储为float)。