|
まず浮動小数点数の計算は、どうしても誤差が出る性質になっていて、ほとんどのプ
ログラミング言語で誤差が出てしまいます。
Google検索で「浮動小数点数 誤差」とかで検索すると、いろいろ情報が得らえると
思います。
「1:」の時点では、正確には2699.9999999999995くらいの値になっていて、切り捨て
ると2699になるようです。
回避するには、+0.5してから切り捨てして、四捨五入するといいと思います。
hidemath.dllのFormat関数を使うと、sprintfの書式に従った詳細な文字列化ができ
ます。
str()で文字列化する場合は、sprintfの"%1.15lG"の書式に相当する、自動的な都合
のいい文字列化になっています。
精度の具合を確かめる例
setfloatmode 1;
loaddll hidemarudir + "\\hidemath.dll";
if( !result ) {
message "hidemath.dllのロードに失敗しました。";
endmacro;
}
#a = 10;
#X = 29700 / (1 + #a / 100) * #a / 100;
message dllfuncstr( "Format", "%.0lf", #X );
message dllfuncstr( "Format", "%.5lf", #X );
message dllfuncstr( "Format", "%.10lf", #X );
message dllfuncstr( "Format", "%.11lf", #X );
message dllfuncstr( "Format", "%.12lf", #X );
message dllfuncstr( "Format", "%.13lf", #X );
message dllfuncstr( "Format", "%.14lf", #X );
message dllfuncstr( "Format", "%.15lf", #X );
endmacro;
他のプログラミング言語でもだいたい同じで、拡張子.jsで保存してWScriptで実行し
て確かめる例
a = 10;
X = 29700 / (1 + a / 100) * a / 100;
WScript.Echo( X.toFixed(0));
WScript.Echo( X.toFixed(5));
WScript.Echo( X.toFixed(10));
WScript.Echo( X.toFixed(11));
WScript.Echo( X.toFixed(12));
WScript.Echo( X.toFixed(13));
WScript.Echo( X.toFixed(14));
WScript.Echo( X.toFixed(15));
|
|