double MyNormalizeDouble(double value, int digits)
{
int factor = MathRound( MathPow(10, digits) ); // factor - это множитель,
с помощью которого мы из VALUE сделаем целое число
double result = MathRound(factor * value) / factor;
return(result);
}
double a;
double b;
int factor = MathRound( MathPow(10, digits) ); // digits - это точность с которой будем сравнивать
Если сравниваем цены, то это предопределенная переменная Digits
...
if (MathRound( (а - b) * factor ) != 0)
{
... // a != b
}
if (MathRound( (а - b) * factor ) == 0)
{
... // a == b
}
if (MathRound( (а - b) * factor ) > 0)
{
... // a > b
}
if (MathRound( (а - b) * factor ) < 0)
{
... // a < b
}
double a;
double b;
int factor = MathRound( MathPow(10, digits) ); // digits - это точность с которой будем сравнивать
Если сравниваем цены, то это предопределенная переменная Digits
...
if (MathRound( (а - b) * factor ) != 0)
{
... // a != b
}
if (MathRound( (а - b) * factor ) == 0)
{
... // a == b
}
if (MathRound( (а - b) * factor ) > 0)
{
... // a > b
}
if (MathRound( (а - b) * factor ) < 0)
{
... // a < b
}
驚きの結末!どんな桁でも、桁の意味を全く「理解」していないのに、なぜそう思うのでしょうか?
驚きの結末!どんな桁でも、桁の意味を全く「理解」していないのに、なぜそう思うのでしょうか?
私は、このような説明には参加したくありません。というのも、メリットについて話すことがないのなら、なぜ話す必要があるのでしょうか?
プロフェッショナルの皆さんの見識に感謝します
Irtron、 あなたのバリアントを選びました。一般的なケースを想定して少し修正し、確認しました。
int ComparePrice(double a, double b, double digit)
{
a -= b;
b=数字。
なら
を返す(1)。
if (a < -b)
を返します(-1)。
を返します(0)。
}
ありがとうございます。
double digit14=0.00000000000001;
double digit12=0.000000000001;
double digit8=0.00000001;
double digit4=0.0001;
double digit2=0.01;
で、要求される精度を決定します。
この機能については、非常に高速に動作します。
イルトロン さん、いつもありがとうございます。
驚きの結末!桁が何であるかも全く「理解」していないのに、なぜどんな桁でもそう思うのでしょうか?
私は、このような説明には参加したくありません。というのも、メリットについて話すことがないのなら、なぜ話す必要があるのでしょうか?
私はあなたの書いたものを読んだだけです。 あなたの理解は明らかに「あなたのあからさまな...」によって妨げられています。(ようご)
VBAG、ComparePrice()よりも速く2つの数値を比較するNormalizeDouble()という関数があるのに、なぜ車輪を再発明するのですか?
VBAG、ComparePrice()よりも速く2つの数値を比較するNormalizeDouble()関数があるのに、なぜ車輪を再発明するのでしょうか?
同じような自転車や、より良い代替案があれば、ぜひ利用させていただきたいと思います。
謹んで申し上げます。
ウラジミール
VBAG、ComparePrice()よりも速く2つの数値を比較するNormalizeDouble()関数があるのに、なぜ車輪を再発明するのでしょうか?
もし、似たようなホイールやもっと良い代替品があれば、それを使ってみたいと思います。
謹んで申し上げます。
ウラジミール
2007.09.12 07:15:09 $CheckCompareDouble USDJPY,M5: CD: 20485, xNormalize: 51265
結論
CD関数は、2つの数値を比較し、小数点以下14桁で<、>、=の答えを出す関数で、単にNormalizeDouble()を実行するよりも2倍速く動作します(比較するロジックがない場合でも)。
多くの人が、比較には組み込み関数のNormalizeDouble()を使わなければならない、と書いています。(これは開発者も推奨していることです)。
そこで、まず定義したいことがあります。「NormalizeDouble()とは何か、つまり、どのように動作し、どのようなアルゴリズムなのか。
浮動小数点数を指定された精度に丸める。
...
MQL4で丸めがどのように構成されているかは知りませんが(開発者に聞いてください)、標準的な方法として 浮動小数点数を指定した精度に丸めるというものがあります。
ここで、ある機能。
この関数から、まず実数から整数へ、そして再び実数へ戻ることがわかる。
比較のためには、整数値のみで十分です。
したがって、実数を比較するには、整数に変換するのが最も速く、確実な方法だと思うのです。
比較するとこんな感じになります。
これをすべて関数に整形して使うことができる。書くのが面倒くさい!関数の作り方が明確になっているようです。
この方法は、NormalizeDouble()を呼び出すよりも高速だと思います。
MathRound()関数はデフォルトでdoubleを返すので、安全のために整数を返すようにしてもよいでしょう。
最も簡単な方法は、この方法です
そうすると、比較されるのは整数だけとなり、しかもうまく比較されます。
この方法が一番正しいと思うのですが、いかがでしょうか?
だから、実数を整数に変換するのが一番手っ取り早くて確実だと思うんです
比較するとこのようになります。
それが正しいやり方だと思うのですが、いかがでしょう?
イルトロンの コードの良さは、そのコンパクトさにあります(余計なものは一切なく、変数まで保存されているのです!)。
そして、少なくとも の操作ごとに2つの操作を追加すべきだと提案していますね。
それが、スピードのアドバンテージです
そんなことはないだろう。自分で判断してください