浮動小数点をXの倍数(整数)に丸める方法

このQ&Aのポイント
  • 浮動小数点数Fを、Fにより近いXの倍数(整数)に丸める方法を教えてください。
  • キャストして小数点以下を切り捨てて整数化し、Xで除算して余りを求めます。余りがX/2より等しいか小さい場合、余りを減算します。余りがX/2より大きい場合、Xに満たない分を加算します。
  • 上記の手順により、浮動小数点数FをFにより近いXの倍数に丸めることができます。
回答を見る
  • ベストアンサー

浮動小数点をXの倍数(整数)に丸める方法

浮動小数点数Fを、Fにより近いX(整数)の倍数(整数)に丸める方法を教えてください。 自分なりにコード化しましたが、イマイチ美しくないです^^; もっとスッキリした方法があれば教えてください。 よろしくお願いします。 ※Fは正の浮動小数点数に限定します。 long L, mod ; L = (long)F ; //キャストして小数点以下を切り捨てて整数化 mod = L%X ; //Xで除算して余りを求める if ( mod ==0 ) { //既にXの倍数なので何もしない ; } else if ( mod <= X/2 ) { //余りがX/2より等しいか小さい時 L -= mod ; //余りを減算する } else { //mod > X/2の時 L += X-mod ; //Xに満たない分を加算 }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

このやり方だと問題がありますね。 例えば、4.6に一番近い3の倍数は6ですが、Lが4になるために3が答えとして出てきます。 単純にFをXで割って四捨五入した値に、Xをかければいいんじゃないでしょうか。

black2005
質問者

お礼

早速のご回答ありがとうございました。 確かにXが奇数の場合、まずいですね(汗) 仰る方法が良さそうです。 実際にプログラムを組んで検証してみます。 アドバイス感謝致します。

関連するQ&A

  • 浮動小数点数について

    私は浮動小数点数を整数値に変換したいのですが、 各種検索エンジンで探してみたのですが、 ほしい情報が得られなかったので どなたか浮動小数点数を整数値化する方法を知っていましたら 教えていただけないでしょうか?sprintfで表示可能なのはわかりましたが、 表示だけではなく、処理の中でも使用するので、変換できないと だめなんですが、どなたか知っていませんでしょうか?

    • ベストアンサー
    • Perl
  • 浮動小数点数型

    単精度浮動小数点型と倍精度浮動小数点数型、それぞれ値がとりうる範囲を教えてください。 単精度浮動小数点型 負の値は -3.4028235E+38 ~ -1.401298E-45、 正の値は 1.401298E-45 ~ 3.4028235E+38 の範囲の値 倍精度浮動小数点数型 負の値は -1.79769313486231570E+308 ~ -4.94065645841246544E-324、 正の値は 4.94065645841246544E-324 ~ 1.79769313486231570E+308 の範囲の値 とは記述してあるのですが、実際に小数1桁なら整数部はどのくらいの範囲の値がとれるのか、皆目わかりません。 どうか、わかりやすく教えてください。 よろしくお願い致します。

  • 浮動小数点の比較について

    たとえば、以下のコードで、「違う」と表示されるように、浮動小数点の比較に失敗します。 #include <iostream> int main() { float f = 0.1; if (f == 0.1) { std::cout << "同じ"; } else { std::cout << "違う"; } return 0; } double f; とすれば、同じと表示させるのですが、代入して比較するだけで、比較に失敗するのは、どういう理由なのでしょうか?

  • スーパーπは、ALU(整数演算)か、FPU(浮動小数点演算)どちらの性

    スーパーπは、ALU(整数演算)か、FPU(浮動小数点演算)どちらの性能によってスコアが変わるのでしょうか? スーパーπについて調べると、「FPUの性能の比較対象になる」や「整数演算の比較対象になる」など両方の情報があります。 たしかに、L2キャッシュの大小でそこそこスコアが変わるので整数演算の可能性もあります。 しかし、SSSE3対応以前のCPUのスコアがあまり高くないので、浮動小数点演算の可能性もあります。 みなさんは、スーパーπがどちらの比較をしていると考えますか? スーパーπ http://www1.coralnet.or.jp/kusuto/PI/super_pi.html

  • 浮動小数点の問題です。

    10進数+0.375を浮動小数点で記憶させ、その記憶領域のダンプリストを読み取ると、 0.375は16進数で(1)に、 -1は16進数で(2)となる。 答えは(1)は7F00、(2)8600です。 この2つの問題の途中式と解説をお願いします。 バイト型:バイト数は1バイト,負の補数は2の補数で表す 整数型:バイト数は2バイト,負の補数は2の補数で表す 浮動小数点:バイト数は2バイト,符号1ビット,指数部5ビット,仮数部10ビット ビット番号0:符号部.仮数部の符号が入っている.0なら正,1なら負 ビット番号1-5:指数部.負の値を2の補数で表す ビット番号6-15:仮数部.ビット番号6を小数点第1位とする仮数部の小数点以下の絶対値が、正規化された2進数で入っている 正規化とは,仮数部が2進数で0.1以上1.0未満になるよう指数部を増減する操作である

  • Excelで 25.3÷4.7を小数第1位まで計算して余りを出す方法

     Excelで 例えば、25.3÷4.7を小数第1位まで計算して余りを出す方法ってありますか? QuotientやModで整数までなら商と余りを計算できるのですが・・・商も余りも小数まで計算して出すなんてことは可能でしょうか?もしご存知でしたら教えて頂けませんか?Excelに限らずこんなソフトのこんな計算機能を使ったら早いなどありましたら宜しくお願い致します。

  • IEEEの浮動小数点数の表現形式がわかりません!!

    10進小数0.625をIEEEの浮動小数点数表現形式である、 (-1)^S×2^E-127×(1+F) で表したい。S,E,Fの値を求めよ。 なお、(-1)^Sは(-1)のS乗、2^E-127は2のE-127乗である。 という問題です。全然わかりません!! できたら計算過程も載せて下さい!!

  • 輝度を小数点で計算する理由(整数でもいいのでは?)

    アホな質問かもしれませんが、よろしくお願いします。 GPUでは座標計算の他にRGBの輝度計算も行なっているのは周知の事実だと思います。これには、表示する色の諧調を増やすために小数点を使っているという理由もあるのですが、座標を計算するユニット(vertex shader)が浮動小数点数だから、このユニットと仕様を統合するために、輝度計算も小数点で表しているという理由もあるのではないのでしょうか? 別に表示する諧調を増やすだけなら桁数の多い整数でもいいと思うんです。しかし、推測の範囲なので自信が持てません。何かここについて言及している文書やページがあれば、あるいははっきりここの理屈がわかる方がいれば、アホな質問かも知れませんが教えてください。 よろしくお願いします。

  • 浮動小数点エラー

    #include<stdio.h> main (){ float D[5][6] = { {0,0,151.9058382,111.8925551,238.1626765,145.6362657},   {0,151.9058382,0,256.9532465,317.3522119,232.5861795}, {0,111.8925551,256.9532465,0,181.0294098,114.6471}, {0,238.1626765,317.3522119,181.0294098,0,93.41311845} ,   {0,145.6362657,232.5861795,114.6471,93.41311845,0}, };   float data[100][100] ; int n=5; float sum; int i,l; for(i=1;i<=n-2;i++) { sum=0; for(l=i+2;l<=n;l++) { sum=sum+D[i][l]; } ◎ data[i]=D[i][i+1]/(sum/(n-(D+1)));  ←この行 } for (i=1;i<=n;i++){ printf("%f",data[i]); } return (0); } 上のプログラムで、◎の行に浮動小数点の不正な使用とエラーがでてしまいます。 参考書、ヘルプで調べたもののなぜエラーとなるか分かりませんでした。 解決できますでしょうか?

  • データ型について

    VBに限ったことではないのですが、 データ型には、短整数型、整数型、長整数型、単精度浮動小数点数型、倍精度浮動小数点数型といろいろな型がありますが、 整数を扱うなら長整数型、小数も含めて扱うなら倍精度浮動小数点数型 を使えば良いと思うのですが、それにより桁数の小さな短整数型、整数型とかは何のためにあるのでしょうか? あまり大きな値を扱わないときにそちらの型を選ぶメリットは何なのでしょうか?