【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20524

計算結果がずれるんです。
投稿者---ハリオ(2005/04/02 21:32:32)


はじめまして、ハリオと申します。
現在、ゲームを作成しているのですが、
以下のプログラムを実行した場合、なぜか計算結果のずれが
おきるという奇怪な現象に見舞われています。

以下が実際のコードです。


void CFUW_ADV_PicWinManager::SetKfMove(int frame, float x, float y)
{
KEYFRAME* pkf = &_kf[_target];
CFUW_ADV_WINDOW* ppw = &_win[_target];

pkf->frame = frame;
pkf->x = (x - ppw->GetPosX()) / frame;
pkf->y = (y - ppw->GetPosY()) / frame;

LastTime = (float)GetTickCount();
_WaitTime = 0;
}


関数の引数は、frame = 1000, x = 480, y = 240 で、
ppw->GetPosX()で得られる値は、100、
ppw->GetPosY()で得られる値は、0、
が実際に問題が起きる時の決定値です。

pkf->x = (x - ppw->GetPosX()) / frame;

の部分の計算結果は普通なら0.58なのですが、
なぜか0.57999998になってしまいます。

どうか、わかる人が居られれば、ご教授お願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:計算結果がずれるんです。 20525 やすじゃす 2005/04/02 21:58:49
<子記事> Re:計算結果がずれるんです。 20539 REE 2005/04/04 10:20:38


No.20525

Re:計算結果がずれるんです。
投稿者---やすじゃす(2005/04/02 21:58:49)


0.38じゃなくて0.58なのですか?


この投稿にコメントする

削除パスワード

No.20526

Re:計算結果がずれるんです。
投稿者---ハリオ(2005/04/02 22:21:59)


>0.38じゃなくて0.58なのですか?

すいません、ここに書き込んだ文に間違いがありました。
訂正を以下に示します。

関数の引数は、frame = 1000, x = 480, y = 240 で、
ppw->GetPosX()で得られる値は、-100、
ppw->GetPosY()で得られる値は、0、
が実際に問題が起きる時の決定値です。

これで、

pkf->x = (x - ppw->GetPosX()) / frame;

の部分の計算結果が普通なら0.58になるのですが、
なぜか0.57999998になってしまいます。


この投稿にコメントする

削除パスワード

No.20527

Re:文字・モノクロからの脱却。
投稿者---おでん(2005/04/02 22:49:31)


>の部分の計算結果が普通なら0.58になるのですが、
>なぜか0.57999998になってしまいます。

以下参照
http://www.ics.kagoshima-u.ac.jp/edu/expII3/exII3_3.html


この投稿にコメントする

削除パスワード

No.20528

Re:題名を間違いました m(_"_)m
投稿者---おでん(2005/04/02 22:51:17)


>>の部分の計算結果が普通なら0.58になるのですが、
>>なぜか0.57999998になってしまいます。
>
>以下参照
>http://www.ics.kagoshima-u.ac.jp/edu/expII3/exII3_3.html


この投稿にコメントする

削除パスワード

No.20530

Re:計算結果がずれるんです。
投稿者---Blue(2005/04/02 23:12:55)


とにかくこちら側には解答できるだけの情報が少ないと思います。
  • コンパイラやOSはなんなのか?
  • それぞれの型はなんなのか? pkf->x = (x - ppw->GetPosX()) / frame; (赤は提示ソースだけでは不明な型の変数)
  • 値がずれるのはそのときだけなのか?
私の環境で以下のソースを試してみたら 正しい値が取れましたが。 (不明型は予想)
#include <stdio.h> int main( void ) { float x = 480; float PosX = -100; float pkfx; int frame = 1000; pkfx = ( x - PosX ) / frame; printf( "%f\n", pkfx ); return 0; }
環境 WindowsXp SP2 VC++6.0 SP6 および Borland C++ 5.5.1



この投稿にコメントする

削除パスワード

No.20534

Re:計算結果がずれるんです。
投稿者---ハリオ(2005/04/03 21:22:52)


こんばんは、ハリオです。

関数の引数 frame と メンバ変数 _target と pkf->frame 以外は、
すべてfloat型です。pkf->x も ppw->GetPosX() も float型です。
環境は、 Windows2000  VS.NET Academic  です。

問題が起きるプロジェクトでは、

x - ppw->GetPosX() が 540、 frame が 10 の場合は、

計算結果が54.0000…と正確に出るのですが、

x - ppw->GetPosX() が 540、 frame が 100 の場合のように、

計算結果が小数点までいく場合になると誤差がおきます。
上記の計算結果では、 5.8000002 と出力されました。

ちなみに、新しくプロジェクトを作成してBlueさんと同じようなプログラムも作成したのですが、
そちらは計算結果には誤差は一切出ませんでした。


この投稿にコメントする

削除パスワード

No.20539

Re:計算結果がずれるんです。
投稿者---REE(2005/04/04 10:20:38)


>の部分の計算結果は普通なら0.58なのですが、
>なぜか0.57999998になってしまいます。
>
>どうか、わかる人が居られれば、ご教授お願いします。

特に奇妙でもなんでもなく、単なる誤差です。
浮動小数には誤差がつきものです。
どのような場合に誤差が発生するかといえば、
その数値を2進数で表現したときに、精度以上の多くの桁が必要になる場合です。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧