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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0821
しょうけい計算の結果を正常に返したい5解決


しょうけい

リンク

2017/8/21(Mon) 00:06:25|NO.81029

以下の計算式の結果が マイナス値になってしまいます。
仕様上仕方ない物なのかもしれないですけど デバッグでも調べにくいうえにものすごく迷惑
なんですけど。

これの正常な計算結果を出す方法ありませんか?
なるべくシンプルな処理で

A = 103570 B = 20736 C = 139565 D = 0 F = 0 F = A * B / C + D mes F

予想してた結果:+15388
結果:-15385

誰かご教授お願いします。



この記事に返信する


kanahiron

リンク

2017/8/21(Mon) 00:17:49|NO.81031

A*Bの時点で符号付き32bit整数値の範囲を越えてマイナス値になってしまっています

64bit整数値を扱えるようになる以下の物を使うか
HSP用 超計算モジュール
 http://www.tvg.ne.jp/menyukko/cauldron/hmexcalc.html
longint.dll
 http://hp.vector.co.jp/authors/VA034288//longint/index.html

今回の例ならこれでもいけますが、下1桁の精度は保証されないです。

A = 103570 B = 20736 C = 139565 D = 0 F = 0 F = int(1.0 * A * B / C + D) mes F



しょうけい

リンク

2017/8/21(Mon) 00:22:27|NO.81034

>>kanahironさん

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

longint.dllはアリかもしれませんね・・・

ただ、書き損ねていたのですが
今回は可能な限り、精度と効率の両方を要求したいところもあります。
longint.dllがどれくらいのものなのかは試してみますが、
上記の二つを両立できる方法があれば そこもご教授いただけないでしょうか



Fubuki

リンク

2017/8/21(Mon) 00:28:38|NO.81035

 ご質問の計算は、

  1. A*Bを計算する
  2. 1.の結果をCで割り、小数点以下を切り捨てる
  3. 2.の結果にDを足す

という流れになっています。

 しかし、1.の計算の結果はHSPの通常の数値(int型と言い、符号付32ビット地です)の扱える範囲
(-2,147,483,648 〜 2,147,483,647)を超えてしまっているために結果がおかしくなっています。
 解決策としては、様々考えられますが、とりあえずは以下が簡単です。


方法:一旦、小数点付きの値(double型と言い、64ビットです)で計算する


A = 103570.00 B = 20736 C = 139565 D = 0 F = 0 F = int( A * B / C ) + D mes F
※計算に使う数値の種類(型といいます)は、計算の中で次のように決まります。
1.文字があれば文字になる。
2.文字がなく、少数の値があれば少数となる
3.それもなければ整数値となる
※ここでは、割り算の結果(少数です)をint()関数によって整数に直しています。
 元々の式と同様、小数点以下は切り捨てとなります。



 また、大きな数を扱えるlongIntというモジュールもあります。(興味があれば検索してください)



 お役に立てましたら幸いです。



Fubuki

リンク

2017/8/21(Mon) 00:30:00|NO.81036

行き違い失礼しました。



しょうけい

リンク

2017/8/21(Mon) 00:46:44|NO.81037

試しに
longintと
int(1.0 * A * B / C + D)
でやってみたところ 後者の方でも精度も大きくズレてるわけでもなく
いい感じに収まったので いったんは(修正も楽ですし)後者の方法にしようと思います。

kanahironさん
Fubukiさん

ありがとうございました。

以上を持って解決とさせていただきます。



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