« 【よみもの】ゆめゆめ日記 第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
口臭チェッカー市場