• ベストアンサー

四捨五入方法

四捨五入を行いたいのですが、処理速度が速いやり方を知っている方がいましたら、教えてください。

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

  • ベストアンサー
  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.8

((a << 1) / b + 1) >> 1 はどうでしょう。 私の環境では下のプログラムで約30秒でした。 ただ、 (a / b * 10 + 5) / 10 もやっぱり30秒だったんですよね。 ビット演算のほうが計算コストがかからなかったはずなんですけど。 コンパイラが最適化してくれたのかな。 inline int div(int a, int b){ return ((a << 1) / b + 1) >> 1; } int main(){ int a,b; time_t starttime; time(&starttime); for(a=1;a<100000;a++) for(b=1;b<100000;b++) div(a,b); printf("%d second\n",time(NULL)-starttime); return 0; }

20692
質問者

お礼

ありがとうございました。 レスポンスがネックになり、苦労しております。 また、色々と質問をすることがあると思いますので、ご協力をお願いいたします。

すると、全ての回答が全文表示されます。

その他の回答 (8)

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.9

これでは意味が無かったですね。 (a / b * 10 + 5) / 10 こちらで。 (a * 10 / b + 5) / 10 ちなみに、 ((a << 1) / b + 1) >> 1 は、 (a * 2 / b + 1) / 2 と同義で、上の式を5で約分しただけです。

すると、全ての回答が全文表示されます。
  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.7

No.4です。 間違ってたので訂正します。 >(A / B) + (A % B >= (B >> 1)); じゃなくて (A / B) + (((A % B) << 1) >= B); です。 ちなみに、これはNo.5の方と同じ意味です。

すると、全ての回答が全文表示されます。
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.6

floatを使っていい場合、まず思いつく(そしておそらくもっとも単純な)のは、 0.5を足して小数点以下切り下げだと思います。 intだけでやるなら、1の補足にあった 10倍して5を足して10で割る(あまりは切り捨て) が一番早いのではないでしょうか。

すると、全ての回答が全文表示されます。
  • BILLY-J
  • ベストアンサー率57% (60/105)
回答No.5

では、割り算の理屈から攻めてみます。 C = A / B; D = A % B; として剰余Dも同時に求めます。 この剰余Dと「割る数」Bの関係を思い出して下さい。 D/Bは小数部分の解になりますよね。 つまり、DがBの半分より大きければ、小数部は0.5以上の値 という事になり、四捨五入の切り上げ対象となります。 ここでも掛け算・割り算を使わないなら、 if (B <= D + D) {   C++; } ですかね。 剰余を求めている時点で割り算が1回増えているというツッコミは ご勘弁下さい(笑)

すると、全ての回答が全文表示されます。
  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.4

>int A >int B >A/Bの解を四捨五入したいのですが、全てint型にて処理を行いたいです。 それでは。 (A / B) + (A % B >= (B >> 1)); 逆に遅いかも。

すると、全ての回答が全文表示されます。
  • HOGERA3
  • ベストアンサー率35% (50/139)
回答No.3

・0.5を足してintにキャスト という手もあります。

20692
質問者

補足

int A int B A/Bの解を四捨五入したいのですが、全てint型にて処理を行いたいです。

すると、全ての回答が全文表示されます。
  • 12m24
  • ベストアンサー率23% (193/817)
回答No.2

・整数にするなら、0.5を足してfloor()関数 ・最小桁がわかるなら、(10^(-n)として)0.5*10^(-n)を足して、その桁以下を切り捨てる ・最小桁を変化させたいときは先ほどのnを変化させれるようにする。 でいかがでしょうか?

すると、全ての回答が全文表示されます。
  • ex-tome
  • ベストアンサー率13% (13/100)
回答No.1

状況が把握出来ません。 もっと詳しく書いてください。 (何のソフトとか)

20692
質問者

補足

C言語で四捨五入を行いたいのですが、掛け算、割り算等をあまり使用せずに計算が行いたいです。(処理速度の問題上) 4.5を5となるようにしたいです。 単純に考えると、10倍して5を足して10で割ればもとまるのですが、もっと良い方法があれば教えてください。

すると、全ての回答が全文表示されます。

関連するQ&A