標準的な機能/アプローチの代替実装 - ページ 7

 
pavlick_:

doubleをintegerに変換するのは(この方法では)糞みたいなコードになるからです。Round with friendsは、浮動小数点型から整数型を取得するようには設計されていません。

まあ、関数型をdoubleに変更することを妨げる人はいないでしょう。
そして、言動を慎んでください。
 
Nikolai Semko:
まあ、関数の型をdoubleに変えても誰も止めないんだけどね。
そして、言動を慎んでください。

悪気はないんです。整数に変換するためのrint, lrint, llrintがいろいろある。ロング(ダブル)の方がはるかに簡単なのに、理由があって登場したわけではありません。浮動小数点から整数への変換は、概念的な誤りです。

 
pavlick_:

悪気はないんです。整数に変換するためのrint, lrint, llrintがいろいろとあります。long(double)よりも簡単にできるのに、理由があって発明されたのです。浮動小数点から整数への変換は、概念的な誤りです。

あぁ、輪から外れただけか...。
 
Nikolai Semko:
あぁ、手が届かないんだなぁ...。

よし、UBは君の手の中にある。

 
fxsaber:
曖昧な解釈のままでは1つの関数呼び出しの 平均時間ではなく、サイクルタイムを出力することにした。

利得は3倍から8倍です。

もしかしたら、Time-to-Functionの計算方法は完璧ではないかもしれませんが、かなり客観的です。でも、もっといい、公平な方法を提案してくれる人がいれば、それは嬉しいですね。

完全な類推のためにタイプダブルに変更しました。

double Ceil (double x) { return double((x-(long)x>0)?(long)x+1:(long)x);}
double Round(double x) { return double((x>0)?(long)(x+0.5):(long)(x-0.5));}
double Floor(double x) { return double((x>0)?(long)x:((long)x-x>0)?(long)x-1:(long)x);} 
2018.08.25 22:16:01.309 TestRound (EURUSD,M10)  Время цикла без округления = 1.315 наносекунд, сумма = 5249993749.98145962
2018.08.25 22:16:01.309 TestRound (EURUSD,M10)  Время выполнения функции sqrt = 0.628 наносекунд, сумма = 81969849.90928555  // даже квадратный корень вычисляется в несколько раз быстрее чем штатные функции округления
2018.08.25 22:16:01.313 TestRound (EURUSD,M10)  Время выполнения функции ceil =  2.037 наносекунд, Контрольная сумма = 5250492895.0
2018.08.25 22:16:01.315 TestRound (EURUSD,M10)  Время выполнения функции Ceil =  0.587 наносекунд, Контрольная сумма = 5250492895.0
2018.08.25 22:16:01.318 TestRound (EURUSD,M10)  Время выполнения функции floor = 2.247 наносекунд, Контрольная сумма = 5249492896.0
2018.08.25 22:16:01.320 TestRound (EURUSD,M10)  Время выполнения функции Floor = 0.385 наносекунд, Контрольная сумма = 5249492896.0
2018.08.25 22:16:01.323 TestRound (EURUSD,M10)  Время выполнения функции round = 1.610 наносекунд, Контрольная сумма = 5249992896.0
2018.08.25 22:16:01.324 TestRound (EURUSD,M10)  Время выполнения функции Round = 0.181 наносекунд, Контрольная сумма = 5249992896.0

開発者は、このアルゴリズムを通常の関数で使用することをお勧めします。

ファイル:
TestRound.mq5  7 kb
 
)).これは、値の範囲を正確に知っている個人的な工芸品にのみ適用されるかもしれませんが、標準ライブラリには適用されません。組み込み関数は馬鹿が書いたものではない、自分が一番賢いと思うなよ。ここで、未定義・未指定の動作も書いておいて、そのように動作しないことに驚いている友人がいますhttps://www.linux.org.ru/forum/development/14422428#comments. これらの数ナノ秒の節約は、実際のアルゴリズム(裸のループではありません)では、目に見えるものではありません。
 

丸め関数もなぜdoubleを返さなければならないのか理解できない。私の考えでは、そこが丸めのポイントであり、浮動値から整数を得る方法を定義する必要があるのです。

変換の「概念的な誤り」が何であるかは、私にもよくわかりません。

 
Georgiy Merts:

丸め関数もなぜdoubleを返さなければならないのか理解できない。私の考えでは、そこが丸めのポイントであり、浮動値から整数を得る方法を定義する必要があるのです。

変換の「概念的な誤り」が何であるかは、私にもよくわかりません。

整数の外側に何が出るか考える。
 
fxsaber:

NormalizeDouble

結果は、MyNormalizeDouble(Optimize=1)が1123275、1666643と有利になります。最適化しない場合は4倍(メモリ内)高速化されます。


いつもお聞きしたいのですが、コードスタイルでプログラミングできることは多い のでしょうか?

非常に複雑な機構を自分で設計して作るというタスクがあった場合、自分のコードの書き方を使う価値があるのか?そして、各レコードの性能をステップごとに確認する必要があります。

あなたのスタイルとレベルでこのプロセスに取り組んだ場合、開発者がコードを読み/書き/検証するのにどれくらいの時間がかかるでしょうか?

きっと、思い描いたことの半分も書けずに年をとっていくんだろうな。


zyです。オフトピで申し訳ないです。プログラミングのスタイルは、個人の問題です。しかし、ある時期から、生産性を高める ために、コードはできるだけ読みやすくあるべきだと思うようになります。

Productivity - США - MetaTrader 5
Productivity - США - MetaTrader 5
  • www.metatrader5.com
Индекс производительности труда показывает изменение объема выпущенной продукции, приходящегося на одного работника. Этот показатель полезен для предсказания инфляции и прироста объема производства. Если стоимость труда увеличивается соответственно увеличению производительности, и, кроме того, маловероятно увеличение производственных издержек...
 
Реter Konow:

ずっと聞きたかったのですが、あなたのスタイルのコードでは、どれくらいの プログラムができるのでしょうか?

私のスタイルの一例?