看此文前,你可以首先参考一下《J2ME中定点库MathFP使用入门》一文。MathFP是一个定点的浮点模拟工具,这套类库没有封装细节,而是把一系列的转换操作留给了用户,这些频繁的操作非常容易出错,但是效率上占一定的优势。考虑到极少有J2ME设备设有浮点运算单元,特别是在CLDC1.0设备上不适合使用沉重的浮点运算。所以如果你的应用需要进行沉重的浮点运算,比如基于浮点的游戏,可以采用MathFP。这样至少比你采用手动的乘除法来的优雅。而对于并非沉重的浮点计算,我推荐大家使用由_Nikolay Klimchuk_ 开发的henson.midp.Float库(ver 1.01) ,一个封装良好的Float类。
henson.midp.Float类简介
首先到http://henson.newmail.ru/j2me/Float.java下载源代码。
henson.midp.Float类非常适合科学计算,他的范围很大,具有64位的尾数(mantissa),64位的指数。该Float类和J2SE标准的Float类十分的相似,提供了完备的方法,参考下表:
非静态成员
非静态成员
常量
Float()
Float(long value)
Float(long value, long e)
Float(Float value)
String toString()
Float Add(Float value)
Float Sub(Float value)
Float Mul(long value)
Float Mul(Float value)
Float Div(long value)
Float Div(Float value)
boolean Great(Float x)
boolean Less(Float x)
boolean Equal(Float x)
Float Neg()
long toLong()
boolean isError()
Float sin(Float x)
Float cos(Float x)
Float sqrt(Float x)
Float tan(Float x)
Float asin(Float x)
Float acos(Float x)
Float atan(Float x)
Float atan2(Float x, Float y)
Float parse(String str, int radix)
Float eXP(Float x)
Float log(Float x)
Float log10(Float x)
Float pow(Float x, Float y)
Float ceil(Float x)
Float floor(Float x)
Float abs(Float x)
Float Int(Float x)
Float Frac(Float x)
Float toRadians(Float x)
Float toDegrees(Float x)
Float ERROR
Float ZERO
Float ONE
Float PI - pi
Float E - Euler's constant
Float LOG10 - Natural logarithm of 10
Float LOGdiv2 - Natural logarithm of 0.5
Float PIdiv2 - pi/2
Float PIdiv4 - pi/4
Float PIdiv6 - pi/6
Float PIdiv12 - pi/12
Float PImul2 - pi*2
Float PImul4 - pi*4
Float的使用和大多数提供源代码的第三方库一样,只要直接将其加入到你的工程中来就可以了。
Float类的license很特别,根据作者的要求,需要你做到以下几点:
一个含有此Float类的你的产品的copy和以及对应的license
在about菜单中增加“henson.midp.Float (C) by Nikolay Klimchuk ”版权提示
如果有官方网站,则网站应该提供到http://henson.newmail.ru的链接
测试数据
也许你最关心这个模拟类的速度。以下是官方的测试数据供你参考。
测试程序下载地址:
http://henson.newmail.ru/j2me/FloatTest.jad
http://henson.newmail.ru/j2me/FloatTest.jar
机型
sin, ms
100次
cos, ms
100 次
tan, ms
100 次
add, ms
10000 次
mul, ms
10000 次
div, ms
10000 次
sqrt, ms
1000 次
移动电话
/-\ Nokia
N-Gage
1016
594
1641
1297
3438
6328
4219
6310i
4370
2461
7089
5363
14673
24131
20402
3510i
4202
2435
6837
5324
14550
22370
16678
6100
4407
2534
7065
5410
14905
23794
16069
6610
4381
2511
7158
5492
15056
23874
17318
3650
1094
609
1766
1297
3484
7031
4641
7650
765
453
1265
1031
2515
5328
*
6600
328
157
500
188
547
3235
1328
6220
6086
3623
10149
8325
22395
32238
23670
7600
494
290
795
614
1578
2482
1622
3100
6727
3967
10949
9054
24905
36291
26268
6230 (3.14)
965
538
1654
1088
3212
5165
*
6230 (4.28)
705
414
1197
857
2387
3669
2378
6230i (3.23)
627
351
994
619
1747
3813
1830
7250
4254
2431
7052
5466
14943
22483
14524
7610
281
141
438
187
453
2719
1109
6260
281
141
406
157
453
2766
1187
6630
110
63
156
94
203
1094
500
/-\ Siemens
S55
28899
16559
50899
36306
101370
200670
169181
M55
30441
17025
53584
38420
105500
207800
*
SX1
1110
672
1875
1563
3985
7141
4203
CX65
844
258
342
327
443
1219
923
S65
212
139
337
245
466
1191
798
M75 (new)
267
153
309
240
420
1186
790
/-\ SonyEriCSSon
K300i (new)
739
354
1094
646
1716
3041
2389
K750i
654
319
980
521
1496
2848
1970
Z1010
785
404
1231
886
2026
3289
2603
K700i
712
370
1085
639
1687
3049
1864
T610
20580
11575
33585
28100
71365
87740
76280
T610 (R3C)
8780
5055
14515
11385
30440
42120
34595
T610 (R6C)
9875
5575
16210
12235
33295
49410
37920
P900
250
109
344
156
406
2203
1062
P800
500
282
813
625
1563
3250
1750
Thank you to Dmitry Gorilowsky for measurements
PDA
/-\ Sony
Clie N610
48830
24960
84770
35810
102100
445530
206440
辅助工具:FloatConv (1.1)
_Nikolay Klimchuk_ 还开发了一些相关工具让该Float的使用变得更加的简单。FloatConv是一个数学转换器,它将数学算数表达式转换为midp1.0平台上使用henson.midp.Float的等价表达式。这样使得使用henson.midp.Float的成本大大降低了。这一工具是基于J2SE 。
该工具的下载地址是:http://www.unteh.com/download/FloatConv/FloatConvW.zip
对CLDC1.1的扩展
henson.midp.Float11 是对CLDC1.1的扩展。提供了CLDC1.1相对比J2SE缺失的浮点操作:
Non-static members
Static members
Constants
double asin(double x)
double acos(double x)
double atan(double x)
double atan2(double y, double x)
double exp(double x)
double log(double x)
double log10(double x)
double pow(double x, double y)
double SQRT3 - Square root from 3
double LOG10 - Natural logarithm of 10
double LOGdiv2 - Natural logarithm of 0.5
下载地址:http://henson.newmail.ru/j2me/Float11.java
henson.midp.Float11的license和henson.midp.Float是一样的。
另外一套功能相似的基于CLDC1.0的LIB是Beartronics Java J2ME Libraries的fpmathlib,地址 :http://sourceforge.net/PRojects/bearlib/,感兴趣的朋友可以自行研究。
(出处:http://www.knowsky.com)