HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0330
z小数の加算と誤差2解決


z

リンク

2010/3/30(Tue) 22:46:52|NO.31679

以下のプログラムを実行すると
  0.0299999999999999990000000000000000000000

  (2) a=0.3 です
と判定されてしまうのに
  -0.0000000000000000034694469519536142000000

  (3) a=0 です
と判定されないのでしょうか?
この辺りの説明が書かれた資料があるなら、教えて下さい。

また hspmath.as に round 関数があるようですが
Excel の round ワークシート関数のような
小数点以下の桁数を指定できる四捨五入があるなら教えて下さい。
(Excel では =ROUND(0.123456,4) とやると 0.1235 が戻ってきます。)

a = 0.0 : mes "" + a if (a==0.0){ mes "(1) a=0 です\n" } a = a + 0.01 a = a + 0.01 a = a + 0.01 : mes "" + strf("%.40f",a) if (a==0.03){ mes "(2) a=0.3 です\n" } a = a - 0.01 a = a - 0.01 a = a - 0.01 : mes "" + strf("%.40f",a) if (a==0.0){ mes "(3) a=0 です\n" } else : if (a<0){ mes "(4) a<0 です\n" }



この記事に返信する


ななしのごんべ

リンク

2010/3/30(Tue) 23:51:07|NO.31682

HSPの実数値は、64ビット倍精度の格納なので
10進数では16桁までの有効範囲しかないように思います。
だから、16桁を超えた場合の値の保証はないと思います。
(16進では8バイト分)
(詳しくは、Wikipediaの「倍精度」参照ください。)

「マイナス値」については、ビットが立っているかどうかなので
0000 0000 0000 0000 = 0
8000 0000 0000 0000 = -0
同じ「ゼロ」でも二進数表記では異なる数として処理される
ことになるのではないかと思います。

また

a = a + 0.015 a = a + 0.01 a = a + 0.01 : mes "" + strf("%0.2f",a) if (a==0.03){ mes "(2) a=0.3 です\n"

とすると、aの表示は四捨五入されるようです。
[strf]のドキュメントを参照してください。



z

リンク

2010/3/31(Wed) 20:15:10|NO.31713

実数値に付いての説明、ありがとうございました。
strf を使った四捨五入も理解できました。
小数を使った計算はいろいろと気を使う必要があるんですねー



ONION software Copyright 1997-2023(c) All rights reserved.