« Tina Brooks | Home | kokiriko bushi »

Jan 072008

誤差

PC上での計算は乗算の方が除算よりも効率的だというのは、なんとなく知っていて、
200/100
より
200*0.01
の方が良かろうと思っていたのですが、
ちとAS3で色々試していると(Loading系)

var _rate:Number = 100*dr.loaderInfo.bytesLoaded / dr.loaderInfo.bytesTotal;
_rate = Math.round(100 * _rate)*0.01;
みたいな事をやっていたのですけど、これでやってると
1.8
1.83
1.86
1.86
1.8900000000000001
1.9100000000000001
ってなかんじで誤差が出てしまう。

で、

var _rate:Number = 100*dr.loaderInfo.bytesLoaded / dr.loaderInfo.bytesTotal;
_rate = Math.round(100 * _rate)/0.01;
でやると
1.8
1.83
1.83
1.86
1.86
1.89
1.91
ってな具合にすっきり。 あんまり乗算に置き換えない方が良いですかね?

違う問題なのかいな?

追記:2008/01/07 16:53
ちとこの問題がAS3固有のものなのか?(AS2ではこのような現象は見たことがないので)を検証。

for (var i = 0; i<100; i++) {
	var ran1 = Math.random()*100;
	var ran2 = Math.random()*100;
	var ran3 = Math.round(ran1*ran2*100)*a;
	trace(ran3);
}
これをAS3で実行すると、
7802.610000000001
5107.650000000001
のような誤差が発生する。

で、これをAS2で実行すると誤差が発生することはない。(100*10回ぐらいしか試してないですが)

はて・・。

で、100で除算した場合はどちらも問題なく誤差は発生しませんでした。
どうもAS3において、Number同士の演算にはなにかしら誤差が発生するのかも知れません・・・。

ちなみに
0,01を
0.01000000000000000000000000000000000000000000000000
とかにしても駄目でした。
ついでに
1E-2;
でも駄目でした。

2 Comments

0.01を掛けると、最初から浮動小数点演算で、100で割ると、途中までは整数で扱われるからたまたま誤差が0になったように見えただけ、とか・・・・
いずれにしても小数を扱う時には誤差が発生する事を覚えておかないとダメなんですね・・・

どうもこの問題はAS3になってからの問題のようです。
ちょっと調べてみたので後で追記しておきます。

Leave a comment

Search and Archives