« 【よみもの】ゆめゆめ日記 第4回 | メイン | HSPTV!メルマガ 第73号 »

2009年06月10日

【講座】「教えて!おにたま!!」

はじめまして。
累乗を計算してたら、何か挙動がおかしいので困ってます。
HSPで累乗するために hspmath.as のpow関数を使っているのですが、
出てくる値を整数型に変えるとおかしい数になってしまいます。
2の3乗が7、2の6乗が63など・・・。
これは整数型に変えちゃだめなんですか?
int関数で変換しなくても、整数と一緒に計算しただけで
勝手に整数型になっておかしい数字になります。
計算がくるって正しい結果が出せません;
これはいったいどういうことか教えてくださいorz
10進数を2進数につたないながらも変換しようとしていました。。

<こたえ>

お便りありがとうございます。
HSP3の実数計算は、64bitの精度を持っていますが、計算の内容に
よっては誤差が出てしまうことがあります。
hspmath.asのpow関数は、累乗を求めるものですが、近似値を得る
ようになっているため、整数に変換した時に誤差が出ることが
あります。以下のスクリプトを実行してみてください。

#include "hspmath.as"

a=pow(2,3) ; 2の3乗を求める
mes a ; そのまま表示
mes strf("%.16f",a) ; 小数点以下16桁を表示

最初は、計算結果が代入されている変数の内容をそのまま表示
しています。この時は「8.0」ですが、実際に小数点以下の細かい
部分まで表示してみると、「7.9999...」という数値になっています。
int関数などで整数に変換すると、「7.9999...」の整数部分である
「7」だけを取り出してしまい、誤差が出ることになります。
ただ、そのまま表示した場合は、「8.0」になっている点が不可解です。
通常の実数表示では小数点以下6桁程度までを取るようになっていて、
その際に有効な桁から下は四捨五入しているため、このような結果に
なっているのです。
もし、この四捨五入された値で整数に変換したい場合は、一度
文字列型に変換してから、再度整数値に戻すといった方法を取ることも
可能です。

#include "hspmath.as"

a=pow(2,3) ; 2の3乗を求める
st=str(a) ; 文字列に変換
mes int(st) ; 整数として表示

ところで、10進数を2進数に変換という目的であれば、実数で計算を
行なう必要はないので、最初から整数ですべて行なうのも手だと
思います。また、2のn乗を計算するのであれば、演算子「<<」を
使うことができます。
以下は、2のn乗を求めるスクリプトです。

repeat 9
n=cnt
val=1 ‹‹n ; 2をn乗する
mes "2^"+n+"="+val
loop
stop

それでは、またまた。HSPに限らず、PCのコトや
プログラミング関係どんなことでもお便り待っていますね。

(おにたま)

投稿者 usuaji : 2009年06月10日 01:41

口臭チェッカー市場