ceil(),round(),floor()関数の実行速度 - ページ 5 12345678 新しいコメント pavlick_ 2017.08.25 17:58 #41 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()に全く来ないことに気がつくかもしれません。 Andrey Kisselyov 2017.08.25 17:59 #42 Nikolai Semko: みぬくx = 3 (任意の整数) のとき、ジャムが発生します :)) 関節があるのは私のですか、それともあなたの式ですか? 謹んで申し上げます。 Nikolai Semko 2017.08.25 18:04 #43 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);が、実行速度を最大限に維持しながら、今のところ最も正しい。 Andrey Kisselyov 2017.08.25 18:06 #44 Nikolai Semko: 以前使っていたものではそしてあなたの中にも。x=3 の場合、どちらの場合も 4 という誤った値になります。と、バリアントの場合。が、実行速度を最大限に維持しつつ、今のところ最も正しい。が、その入力に整数を与えるのに、なぜこの式が必要なのか? を尊重します。 追伸:もしあなたが良いプログラマーになりたい のであれば、どこでも、常に、あらゆる種類の高速化関数を押し込む必要が あるわけではないことを理解する必要があります。 Nikolai Semko 2017.08.25 18:10 #45 Andrey Kisselyov:しかし、その入力に整数を与えるときに、なぜこの式が必要なのでしょうか? 敬具整数なのか非整数なのかわからない場合があります。倍数が整数になることがある。 Nikolai Semko 2017.08.25 18:14 #46 Andrey Kisselyov:追伸:良いプログラマーに なりたいのであれば、どこでも、常に、あらゆる種類の高速化関数を押し込む必要が あるわけではないことを理解する必要があります。 もちろんです。だから、「適宜適用」と 書いたのです。 Andrey Kisselyov 2017.08.25 18:14 #47 Nikolai Semko: 整数なのか非整数なのかわからない場合があります。数字が整数になることがある。 そして、そのまま入力番号のバリエーションを増やしてください。if(x-(int)(x)>0)y=(int)(x)+1; else y=x;謹んで申し上げます。 追伸:doubleは定義上、整数にはなり得ないので、マシンメモリ上の数値の表現は変わりません。 Nikolai Semko 2017.08.25 18:17 #48 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); Andrey Kisselyov 2017.08.25 18:20 #49 Nikolai Semko: ということで、大げさなことをする必要はありません。の方が書きやすい。 で 1-0.9999999999999998をすると、うまくいきません。 この方法を使えば、計算式がうまくいかない数字を見つけることができます。 謹んで申し上げます。 Nikolai Semko 2017.08.25 18:23 #50 Andrey Kisselyov: で うまくいくわけがない。 この方法だと、計算式がうまくいかない数字が出てくるんです。 謹んで申し上げます。すでにこちらで書いて います。 同じことを繰り返さないように、このスレッドを読み直すことをお勧めします。 12345678 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
もちろん、その通りです。でも、繰り返します。99.9%のタスクでは、丸め関数を、小数型の(int)や(long)への変換を用いたより高速な代替関数に置き換えることが絶対に正しいのです。経験豊富なプログラマーは、このことを意識して、都合の良い時に適用すれば良いのです。
99%の場合、丸めを気にする必要は全くありません。価格比較のために、私はこんな無意味なものを持っています。
速度は測っていませんが、ほとんどの場合、round()に全く来ないことに気がつくかもしれません。
みぬく
x = 3 (任意の整数) のとき、ジャムが発生します :))
謹んで申し上げます。
私やあなたの式にバグがあるのでしょうか?
謹んで申し上げます。
以前使っていたものでは
そしてあなたの中にも。
x=3の場合、どちらも4という誤った値になります。
とバリアントがあります。
が、実行速度を最大限に維持しながら、今のところ最も正しい。
以前使っていたものでは
そしてあなたの中にも。
x=3 の場合、どちらの場合も 4 という誤った値になります。
と、バリアントの場合。
が、実行速度を最大限に維持しつつ、今のところ最も正しい。
が、その入力に整数を与えるのに、なぜこの式が必要なのか?
追伸:もしあなたが良いプログラマーになりたい のであれば、どこでも、常に、あらゆる種類の高速化関数を押し込む必要が あるわけではないことを理解する必要があります。を尊重します。
しかし、その入力に整数を与えるときに、なぜこの式が必要なのでしょうか?
敬具
整数なのか非整数なのかわからない場合があります。倍数が整数になることがある。
追伸:良いプログラマーに なりたいのであれば、どこでも、常に、あらゆる種類の高速化関数を押し込む必要が あるわけではないことを理解する必要があります。
整数なのか非整数なのかわからない場合があります。数字が整数になることがある。
謹んで申し上げます。
追伸:doubleは定義上、整数にはなり得ないので、マシンメモリ上の数値の表現は変わりません。そうすると、入力時の数字の選択にも大きな工夫が必要になってきます。
謹んで
というわけで、大げさなことは言わない。
書きやすくなりました。
またはこれ
ということで、大げさなことをする必要はありません。
の方が書きやすい。
1-0.9999999999999998
をすると、うまくいきません。
この方法を使えば、計算式がうまくいかない数字を見つけることができます。
謹んで申し上げます。
で
うまくいくわけがない。
この方法だと、計算式がうまくいかない数字が出てくるんです。
謹んで申し上げます。
すでにこちらで書いて います。
同じことを繰り返さないように、このスレッドを読み直すことをお勧めします。