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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0922
竹本少数の扱い5解決


竹本

リンク

2020/9/22(Tue) 19:28:01|NO.91428

下記の計算をすると、最後に整数にしたときに、41ではなく40になってしまいます。

少数をつかえる変数にしてるんですが、なにか勘違いしてるんでしょうか?



a=0.41 mes a a=a/100 mes a a=a*10000 mes a mes int (a)



この記事に返信する


X

リンク

2020/9/22(Tue) 20:43:03|NO.91429

HSP純正のデバッガだと41.000000となっているかと思いますがknowbugというデバッガだと
40.9999999999999930となっております。
knowbugの方が正確でintに変換した際小数部分が切り捨てられ40となってしまいます。



沢渡

リンク

2020/9/23(Wed) 10:41:34|NO.91436

ちょっと実験してみたのですが、実数を画面に表示する際は、
「表示されない桁の一番左の桁を四捨五入した数値」が
表示される模様?

a=0.41 a=a/100 a=a*10000 repeat 20 mes strf("%2."+str(cnt)+"f",a) loop //小数点以下の桁数が14桁になるあたりから正確な値が表示され始める
実数(小数を含む値や、極端に大きな値)は計算の際に
微少な誤差が生じることがありますので、
プログラマーやユーザーが想定している値とは
微妙に異なる値になることがあります。
(今回の例で言えば、41.000000を想定しているのに、
実際の数値は40.999999になっている)
実数演算は「計算結果が少しぐらい大雑把でも良い」という場面以外では
あまりやらない方がいい、ということになるでしょうか。



メルクーフ

リンク

2020/9/23(Wed) 18:20:21|NO.91439

 結局のところコンピュータ内では2進数でしか計算できませんから、10進数による小数の計算で誤差が生じるのはやむをえないかと。

 参考になるかどうか分かりませんが私は通常、int関数に小数を渡す時は0.5足して四捨五入をしています。四捨五入したくなければ影響なさそうな非常に小さな数を足してやれば誤差回避になるかもしれません。



MillkeyStars

リンク

2020/9/25(Fri) 11:56:47|NO.91442

単純に、情報落ちしてるだけだと思うけどね。
あまりにも大きな桁を計算しようとすれば、それだけ情報落ちが発生する。

なので、 a = a * 10000 ではなく、a = a * 10 を 4回行うなどの対策が必要。
(情報が消えない範囲で四則演算を行うといいよ)

参考URL : https://www.cc.kyoto-su.ac.jp/~yamada/programming/float.html#johouot



竹本

リンク

2020/9/28(Mon) 08:17:39|NO.91465

回答ありがとうございます。

%で入力して、それを内部で100で割って比率にし、
10000個中の割合?みたいな計算です。

0.1足すなり、四捨五入で0.5を足すとか考えてみます。



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