//+------------------------------------------------------------------+//| Сравнивает два значения типа double. |//| RESULT |//| Возвращает истину, если значения равны и |//| ложь в противном случе. |//+------------------------------------------------------------------+bool CEnvironment::DoubleEquals(constdouble a,constdouble b)
{
//---return(fabs(a-b)<=16*DBL_EPSILON*fmax(fabs(a),fabs(b)));
//---
}
import ex5が最適化の弊害であることが判明。
グローバルに最適化できるという点では、そうですね。
コードを小さくしようとせず、かなり積極的にインライン化しています。そのため、全体最適化モードでは、非常に優れたコードを生成することができます。
これは、コンパイル時に、結果のスピードを最優先していることからもわかります。
ファクスセーバー
あなたのコードにエラーがあります
ありがとうございます、訂正しました。
それでも間違い。
最後に5になるはずです。
それでもエラー
これはエラーではなく、四捨五入です。標準版ではそうなっています。
以下は、テスト用のコードです。
これがあなたのコードです、テストしてみてください。
Val2 - 正解です。Longに変換後のVal3 - 正しくありません。どうやら、浮動小数点数の二重表現の特殊性のようです。EPSILONをインクリメントする必要があります。寝ぼけた頭で考えてもわからない。もしかしたら、知識のある方がヒントをくれるかもしれません。
開発者が どのような配慮でこれを書いたのか把握する必要がある
ここが犬の埋葬場所のようです。
ここが犬の埋葬場所のようです。
RSDNフォーラムから根を生やす
もちろん、数字の範囲が多少なりともわかっていて、予測できる場合もある。例えば、0...1000とします。この場合、1000*16*DBL_EPSILONのような定数を取ると、大まかな比較ができます。しかし、このような比較は、実際には浮動小数点の考え方を固定小数点に変えてしまうことを念頭に置かなければなりません(理由を推測してください)。
CopyTicks の亜種で、オリジナルより数桁速いこともある (from > 0)