Java中默认的浮点类型是double。如果您将像2.5
这样的常量硬编码到您的程序中,Java会自动将其设置为双精度。当你在浮点数或整型数上进行可能从更高精度中受益的操作时,该类型被‘提升’为双精度型。
但在Android API中,从音量到矩形坐标,一切似乎都是浮动的。在大多数绘图中有一个叫做RectF
的结构;F代表浮点数。对于经常将提升的替身转换回(float)
的程序员来说,这真的是一种痛苦。难道我们不都同意Java代码已经足够凌乱和冗长了吗?
通常,数学协处理器和加速器在Java中更喜欢double,因为它对应于内部类型之一。是不是Android的Dalvik VM出于某种原因更喜欢浮动?或者所有的浮点仅仅是API设计中错误的结果?
发布于 2010-03-19 16:45:12
根据CPU的不同,将没有浮点单元(FPU)。因此,它必须在软件中模拟FPU。这对于浮点型比双精度型更快。或者,如果设备有FPU,那么使用浮点数可能也会更快。
发布于 2010-03-20 01:26:38
在没有FPU的设备上,单精度浮点运算比双精度浮点运算要快得多。正因为如此,Android框架提供了一个FloatMath类,它复制了一些java.lang.Math函数,但使用了浮点参数而不是双精度。
在最新的带有FPU的Android设备上,单精度和双精度操作所需的时间大致相同,并且比软件实现快得多。(“为性能而设计”页面是为G1编写的,需要更新以反映各种更改。)
顺便说一句,写"2.5f“或”(浮点数) 2.5“并不重要。无论哪种方式,javac都知道您需要一个单精度的浮点数常量,这就是它生成的结果。您可以通过编写示例程序并检查生成的字节码来验证这一点。
发布于 2010-03-19 16:05:27
对于不需要太多有效数字(如屏幕偏移量)的指标,使用double
s而不是float
s将是内存低效的。在移动设备上,最大限度地提高内存消耗效率至关重要,因为在移动设备上,几乎所有资源都非常宝贵。而且,在处理像Rect
这样的对象时--这些对象可能会被数千人分配--减少多余的位数显然是至关重要的。
我相信还有其他原因:-)
https://stackoverflow.com/questions/2475494
复制相似问题