ceil(),round(),floor()関数の実行速度 - ページ 5

 
Nikolai Semko:


もちろん、その通りです。でも、繰り返します。99.9%のタスクでは、丸め関数を、小数型の(int)や(long)への変換を用いたより高速な代替関数に置き換えることが絶対に正しいのです。経験豊富なプログラマーは、このことを意識して、都合の良い時に適用すれば良いのです。

99%の場合、丸めを気にする必要は全くありません。価格比較のために、私はこんな無意味なものを持っています。

// 0 - first is greater than second
// 1 - equal
// 2 - second is greater than first
uchar compare_prices(double first, double second)
{
   if(first - second >= _Point)
      return 0;
   if(second - first >= _Point)
      return 2;

   first = round(first/_Point);
   second = round(second/_Point);
   
   if(first > second)
      return 0;
   if(first < second)
      return 2;
   return 1;
}

速度は測っていませんが、ほとんどの場合、round()に全く来ないことに気がつくかもしれません。

 
Nikolai Semko:

みぬく

x = 3 (任意の整数) のとき、ジャムが発生します :))

関節があるのは私のですか、それともあなたの式ですか?

謹んで申し上げます。
 
Andrey Kisselyov:
私やあなたの式にバグがあるのでしょうか?

謹んで申し上げます。

以前使っていたものでは

y=ceil(x);  -> y=(int)(x+1);

そしてあなたの中にも。

y=ceil(x);  -> y=(int)(x)+1;

x=3の場合、どちらも4という誤った値になります。

とバリアントがあります。

y=ceil(x);  -> y=(int)(x+0.9999999999999997);

が、実行速度を最大限に維持しながら、今のところ最も正しい。

 
Nikolai Semko:

以前使っていたものでは

そしてあなたの中にも。

x=3 の場合、どちらの場合も 4 という誤った値になります。

と、バリアントの場合。

が、実行速度を最大限に維持しつつ、今のところ最も正しい。

が、その入力に整数を与えるのに、なぜこの式が必要なのか?

を尊重します。

追伸:もしあなたが良いプログラマーになりたい のであれば、どこでも、常に、あらゆる種類の高速化関数を押し込む必要が あるわけではないことを理解する必要があります。
 
Andrey Kisselyov:

しかし、その入力に整数を与えるときに、なぜこの式が必要なのでしょうか?

敬具


整数なのか非整数なのかわからない場合があります。倍数が整数になることがある。

 
Andrey Kisselyov:

追伸:良いプログラマーに なりたいのであれば、どこでも、常に、あらゆる種類の高速化関数を押し込む必要が あるわけではないことを理解する必要があります。

もちろんです。だから、「適宜適用」と 書いたのです。
 
Nikolai Semko:

整数なのか非整数なのかわからない場合があります。数字が整数になることがある。

そして、そのまま入力番号のバリエーションを増やしてください。
if(x-(int)(x)>0)y=(int)(x)+1;
else y=x;

謹んで申し上げます。

追伸:doubleは定義上、整数にはなり得ないので、マシンメモリ上の数値の表現は変わりません。
 
Andrey Kisselyov:
そうすると、入力時の数字の選択にも大きな工夫が必要になってきます。

謹んで


というわけで、大げさなことは言わない。

if(x-(int)(x)>0)y=(int)(x)+1;
else y=x;

書きやすくなりました。

y=(int)(x+0.9999999999999997);

またはこれ

#define _ceil(x)  (int)((x)+0.9999999999999997)
...
y=_ceil(x);
 
Nikolai Semko:

ということで、大げさなことをする必要はありません。

の方が書きやすい。


1-0.9999999999999998

をすると、うまくいきません。
この方法を使えば、計算式がうまくいかない数字を見つけることができます。

謹んで申し上げます。

 
Andrey Kisselyov:

うまくいくわけがない。
この方法だと、計算式がうまくいかない数字が出てくるんです。

謹んで申し上げます。


すでにこちらで書いて います。

同じことを繰り返さないように、このスレッドを読み直すことをお勧めします。