是否更好地转换整个表达式,或者只是转换为不同的类型变量

时间:2011-02-04 21:41:34

标签: java android types trigonometry

我正在使用浮点数来获得一些Android Java游戏图形,但是数学库的trig函数都返回double,所以我必须明确地转换它们。

据我所知,浮点数比双打更快,我不需要高精度答案。

e.g。哪个更好:

screenXf = (float) (shipXf + offsetXf * Math.sin(headingf) - screenMinXf);

screenXf = shipXf + offsetXf * (float) (Math.sin(headingf)) - floatScreenMinXf;

我想其他问题是“我如何在没有其他因素(例如PC服务)混淆问题的情况下在模拟器上测试?”并且“不管怎样,它会在不同的硬件上有所不同吗?”

亲爱的,这是三个问题。生活从来都不简单: - (

-Frink

2 个答案:

答案 0 :(得分:1)

这绝对取决于硬件。我对目标平台一无所知,但在当前的PC上,它需要相同的时间,而浮动的速度是i386上双倍的两倍。

除非您的仿真器能够报告循环次数,否则您无法找到它,因为您的PC的硬件与目标平台的硬件很少有共同之处。当目标平台是您的PC时,我推荐http://code.google.com/p/caliper/用于此微基准测试。

答案 1 :(得分:1)

请考虑使用FloatMath.sin()

FloatMath

  

数学例程类似于Math中的例程。直接对 执行浮点值计算,而不会产生与双重 的转换开销。


但请注意android docs中的这个模糊:

http://developer.android.com/guide/practices/design/performance.html#avoidfloat

  

设计效果
  ...
  在速度方面,更现代的硬件上浮动和双重没有区别。在空间方面,双倍大2倍。与桌面计算机一样,假设空间不是问题,您应该更喜欢双重浮动。

虽然这个家伙@fadden,据称是编写虚拟机的人之一,但是说:

Why are there so many floats in the Android API?

  

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

     

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

他的最后一句话(“页面......需要更新”)是指我上面引用的页面,所以我想知道他是否指的是我上面引用的“无差异”这句话。