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を足すとか考えてみます。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.91428への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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