16

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

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

通常数学协处理器和加速器更喜欢 Java 中的 double,因为它对应于一种内部类型。出于某种原因,Android 的 Dalvik VM 是否有一些更喜欢浮动的东西?还是所有的浮点数只是 API 设计中变态的结果?

4

5 回答 5

43

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

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

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

于 2010-03-19T17:26:37.633 回答
8

根据 CPU 的不同,不会有浮点单元 (FPU)。所以它必须在软件中模拟 FPU。Float 比 Double 更快。或者,如果设备有 FPU,使用浮点数可能也会更快。

于 2010-03-19T08:45:12.373 回答
7

对于不需要太多有效数字的指标(例如屏幕偏移量),使用doubles 而不是floats 会导致内存效率低下。在移动设备上,最大限度地提高内存消耗效率至关重要,因为几乎所有资源都非常宝贵。而且,在处理诸如Rects 之类的对象时——可能会被成千上万个分配——显然,减少多余的位是至关重要的。

我敢肯定还有其他原因:-)

于 2010-03-19T08:05:26.823 回答
3

诡异的。指南中的 Designing for Performance 似乎在说“....桌面系统上的常见做法是自由使用浮点......所以对“float”和“double”的所有操作都在软件中执行...... 。”在http://developer.android.com/guide/practices/design/performance.html#avoidfloat

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

于 2010-03-19T08:15:06.253 回答
1

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

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

考虑

float x = (float) 2.5;

float x = 2.5f;

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

于 2010-03-19T08:47:39.727 回答