浮動小数点数自動整列の問題を解決する
ちょっとした問題ですが、前に考えたことがなかったので、自分に教訓を残しておきます~
今日、プロジェクトで画像の幅を計算しているとき、奇妙な問題に遭遇しました.私の画像はどうしても表示されません.コードは以下の通りです.
実は絵を描く関数の1つで、赤い文は幅と高さのパラメータを表します~(このように書くのは確かに良い習慣ではありませんて、デバッグするのはすべて不便です)だからデバッグのために、2つの文を追加しました.
m_twidth= (m_pTexture->GetWidth())*(800.0/1920.0)*m_scale;
m_theight= (m_pTexture->GetHeight())*(600.0/1080.0)*m_scale;
デバッグしたところ0だったので、すぐに反応したのは間違いなく問題を整理したのだろうか.だから、心の中で推測すると、そのm_pTexture->GetWidth()の幅はint型に違いないが、私の予想外だった.その後、心が安らかに1つ(float)を加えて強く回転し、2つのfloatでいいだろう.
しかし...まだ何もなくて、デバッグしてみるとまだ0です!考えてみると、やはり基礎がしっかりしていないので、小さなプログラムを変えて走ります.
コードは次のとおりです.
多分結果は0_だったと思います0(この結果は私の気持ちを表しています)、やはりそうです.それから私は、1920を800で割って、結果は2で、明らかに「/」が自動的に取り整いましたか.
しかし、正確に計算したいのですが、突然変数を宣言する際の精度が足りないのではないかと考え、float num=0.0000 fに変更しました.もちろん、結果は0_0(……).
突然、霊光が現れると~
結果は0.4166672__となりました0、やっと合った.
浮動小数点数の整頓問題に言及した以上、ここでは整頓についてお話ししましょう.
一般的には、次の方法があります.
1.int a=4.9などのintに直接値を割り当てる.(このようにaは4で、下に整頓され、一般的なコンパイラがデータの損失を示す)a=(int)4.9でもよい.
2.浮動小数点データが小数点以下の数桁(例えば、上の800/1920)に正確でない場合、"/"番号は自動的に整列することができます.
3.floor関数4を使用する.ceil関数の使用(上向きに整列)
今日、プロジェクトで画像の幅を計算しているとき、奇妙な問題に遭遇しました.私の画像はどうしても表示されません.コードは以下の通りです.
m_pRenderer->Draw2dImage(m_positionX,m_positionY,m_pTexture->GetWidth()*(800/1920)*m_scale,m_pTexture->GetHeight()*(600/1080)*m_scale,
m_pTexture ? m_pTexture->GetTextureID() :-1,
0.0f,1.0f,1.0f,0.0f, // texcoords
0.0f, // angle
m_drawColor.r,m_drawColor.g, m_drawColor.b,m_drawColor.a,
0.0f);
実は絵を描く関数の1つで、赤い文は幅と高さのパラメータを表します~(このように書くのは確かに良い習慣ではありませんて、デバッグするのはすべて不便です)だからデバッグのために、2つの文を追加しました.
m_twidth= (m_pTexture->GetWidth())*(800.0/1920.0)*m_scale;
m_theight= (m_pTexture->GetHeight())*(600.0/1080.0)*m_scale;
デバッグしたところ0だったので、すぐに反応したのは間違いなく問題を整理したのだろうか.だから、心の中で推測すると、そのm_pTexture->GetWidth()の幅はint型に違いないが、私の予想外だった.その後、心が安らかに1つ(float)を加えて強く回転し、2つのfloatでいいだろう.
しかし...まだ何もなくて、デバッグしてみるとまだ0です!考えてみると、やはり基礎がしっかりしていないので、小さなプログラムを変えて走ります.
コードは次のとおりです.
float num=0.0f;
num=400*(800/1920);
//num=0.03f;
cout<<num<<”__”<<800/1920<<endl;
多分結果は0_だったと思います0(この結果は私の気持ちを表しています)、やはりそうです.それから私は、1920を800で割って、結果は2で、明らかに「/」が自動的に取り整いましたか.
しかし、正確に計算したいのですが、突然変数を宣言する際の精度が足りないのではないかと考え、float num=0.0000 fに変更しました.もちろん、結果は0_0(……).
突然、霊光が現れると~
float num=0.0f;
num=400*(800.000/1920.000);
//num=0.03f;
cout<<num<<”__”<<800/1920<<endl;
結果は0.4166672__となりました0、やっと合った.
浮動小数点数の整頓問題に言及した以上、ここでは整頓についてお話ししましょう.
一般的には、次の方法があります.
1.int a=4.9などのintに直接値を割り当てる.(このようにaは4で、下に整頓され、一般的なコンパイラがデータの損失を示す)a=(int)4.9でもよい.
2.浮動小数点データが小数点以下の数桁(例えば、上の800/1920)に正確でない場合、"/"番号は自動的に整列することができます.
3.floor関数4を使用する.ceil関数の使用(上向きに整列)