アプリ版:「スタンプのみでお礼する」機能のリリースについて

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

A 回答 (9件)

((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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/01/21 11:54

これでは意味が無かったですね。


(a / b * 10 + 5) / 10
こちらで。
(a * 10 / b + 5) / 10

ちなみに、
((a << 1) / b + 1) >> 1
は、
(a * 2 / b + 1) / 2
と同義で、上の式を5で約分しただけです。
    • good
    • 0

No.4です。



間違ってたので訂正します。

>(A / B) + (A % B >= (B >> 1));
じゃなくて
(A / B) + (((A % B) << 1) >= B);
です。

ちなみに、これはNo.5の方と同じ意味です。
    • good
    • 0

floatを使っていい場合、まず思いつく(そしておそらくもっとも単純な)のは、


0.5を足して小数点以下切り下げだと思います。
intだけでやるなら、1の補足にあった
10倍して5を足して10で割る(あまりは切り捨て)
が一番早いのではないでしょうか。
    • good
    • 0

では、割り算の理屈から攻めてみます。



C = A / B;
D = A % B;

として剰余Dも同時に求めます。
この剰余Dと「割る数」Bの関係を思い出して下さい。
D/Bは小数部分の解になりますよね。

つまり、DがBの半分より大きければ、小数部は0.5以上の値
という事になり、四捨五入の切り上げ対象となります。

ここでも掛け算・割り算を使わないなら、

if (B <= D + D) {
  C++;
}

ですかね。
剰余を求めている時点で割り算が1回増えているというツッコミは
ご勘弁下さい(笑)
    • good
    • 0

>int A


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

それでは。

(A / B) + (A % B >= (B >> 1));

逆に遅いかも。
    • good
    • 0

・0.5を足してintにキャスト



という手もあります。

この回答への補足

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

補足日時:2004/01/20 14:19
    • good
    • 0

・整数にするなら、0.5を足してfloor()関数


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

でいかがでしょうか?
    • good
    • 1

状況が把握出来ません。


もっと詳しく書いてください。
(何のソフトとか)

この回答への補足

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

補足日時:2004/01/20 12:42
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!