nマイクロ秒でxピクセル進む時、tマイクロ秒の時の距離を求めたいのですが、どうしたらいいのか解りません。
n,x,t それぞれ int型で現在は
x / (n / t)
のように求めてるのですが、どうにも精度が思わしくありません。
どうすればいいのかお知恵をお貸しください。
n,x,tの型を変えるのは無しの方向でお願いします。
また出来れば浮動小数・除算も使わない方向で考えて貰えるとうれしいです。
(n / t)の値はintに丸められます。
「浮動小数・除算も使わない方向で」というのが
一時的なキャストすら行いたくないということなのであれば、
「x / (n / t)」を「x * t / n」とするしかないのではないでしょうか。
> どうにも精度が思わしくありません。
どの位の精度を求めているのでしょうか?(x, n, t はそれぞれどの位?)
int型で精度を追求するのは無理があります。
> x / (n / t)
この計算だと、まず (n / t) で誤差が発生し、さらにその誤差を含む値で
除算を行っているので、誤差が増幅します。x * t がオーバーフローしな
いのであれば、 x * t / n の方が精度よく値を求めることができます。
> また出来れば浮動小数・除算も使わない方向で考えて貰えるとうれしいです。
「浮動小数・除算」とは?浮動小数点演算のことですか?
精度を求める場合、浮動小数点を使うことは避けて通れません。
素早い返事ありがとうございます。
NORさん
>「x / (n / t)」を「x * t / n」とするしかないのではないでしょうか。
よくよく考えればそうですね。 算数レベルの問題でした^^;
maruさん
>この計算だと、まず (n / t) で誤差が発生し、さらにその誤差を含む値で
除算を行っているので、誤差が増幅します。
そうなのです。 これでどうしようも無かったのです。
今簡単なゲームを作ってまして、キャラクタの移動を行わせる処理を書いているところでした。
画面座標は所詮整数値ですので、小数点以下の精度は必要無く、また処理速度を稼ぎたい事から今回のような質問をさせていただきました。
お二方の回答で要求を満たすことが出来ましたのでこれで解決とさせていただきます。
ありがとうございました。
解決後だけど、こういう場合に乗除算を使わない方法
Digital Differential Analyzer
という整数演算(加減算のみ)手法があるよ。
# 現代 CPU では整数乗除算命令が十分に速いので DDA は不要だったりするが・・・
# もっというなら下手な整数演算より浮動小数点数演算のほうが速かったりもする。
ツイート | ![]() |