価格 != 価格 ? - ページ 3

 
WHRoeder:
シンプルな解決 策ではなく、多くの計算が必要な場合
単純かどうかは,実装するコードによって決まる ... ...
 
RaptorUK:

そこで、doubleをint型に変換してdoubleを比較するという解決策にたどり着きました。. .

私も、価格を比較するために、創造的な解決策を思いつきました(今のところ)。

int ConvertToPoints (double _price) {
   double price_double = _price / Point;
   int price_int = MathRound(price_double);
      
   return (price_int);
}

価格を整数で表すint型にアップスケールするのです。 このように。

ConvertToPoints(price) != ConvertToPoints(price)

は絶対に成り立たない。

 
stdlib.mq4 のCompareDoubles() はこの議論から失格でしょうか?価格に使用する場合は、私のためによく動作します。
 
Ovo:
stdlib.mq4 のCompareDoubles() はこの議論から失格でしょうか?それは価格のために使用される場合、私のためによく働きます。
しかし、この関数が行うのは等価性の比較だけです。
 
Thirteen:
ConvertToPoints(price) != ConvertToPoints(price)

浮動小数点演算の除算、浮動小数点演算の加算、int型への変換、関数 呼び出し(コピー、ジャンプ、リターン=3、) * 2はすべて2の倍数です。(18) これは、除算と変換が他の演算と同等であると仮定した場合ですが、そうではありません。


if (MathAbs(a - b) > Point / 2.)

引き算1回、テスト1回、否定1/2回(平均)、比較1回。(ポイント/2がinitで行われ、ABSがIFで置き換えられると3/2)

物事を複雑にし過ぎない

丸め誤魔化して等しい時にトリガーされる可能性がある
if (a > b)
aはbより確実に大きい
if (a - b > Point / 2.)
丸め誤差により、aがbより小さいときにトリガーされる可能性あり
if (a >= b)
aは間違いなくbより≧である
if (a - b > -Point/2.)
if (a > b -Point/2.)
if (a +Point/2. > b)
丸め誤差があればトリガがかかる
if (a != b)
間違いなく等しくない
if (MathAbs(a - b) > Point / 2.)
 
WHRoeder:

浮動小数点演算、浮動小数点加算、int型への変換、関数呼び出し(コピー、ジャンプ、リターン=3、)*2がすべて2回。(18) これは除算と変換が他の演算と同等であると仮定した場合ですが、そうではありません。


引き算1回、テスト1回、否定1/2回(平均)、比較1回。(ポイント/2がinitで行われ、ABSがIFで置き換えられると3/2)

複雑にしすぎないで

2013.04.03 17:39:12 TestSpeed-CompareDbls USDJPY,M5: MathAbs(a - b) 9000000 times in 266 ms.


2013.04.03 17:39:11 TestSpeed-CompareDbls USDJPY,M5: ConvertToPoints 9000000 times in 1887 ms.

2013.04.03 17:46:02 TestSpeed-CompareDbls USDJPY,M5: Flat(price) 9000000 times in 3604 ms.

「MathAbs(a-b)メソッドはConvertToPoints()メソッドの約7倍、私のFlat()メソッドの約14倍の速さです。

 
ちなみに、MQL5では、標準的な演算子をオーバーロード すること 非常に エレガントな ソリューションを 実現 することができます。
 
(intRecord > price / point)をテストしてみました。
      intCheck = price /point;
      if (intRecord > intCheck) continue;

2013.04.04 14:27:38 TestSpeed-CompareDbls EURUSD,H4: MathAbs(a - b) HalfAPoint 99999999 times in 3403 ms.

2013.04.04 14:27:42 TestSpeed-CompareDbls EURUSD,H4: (intRecord > intCheck) 99999999 times in 2505 ms.

2013.04.04 14:27:40 TestSpeed-CompareDbls EURUSD,H4: intRecord > price /point 99999999 times in 1712 ms.

しかし、3番目は実用に耐えないし、2番目(intRecord > intCheck)は比較前のintCheckのために1回多く代入されていました。


 
rfb:
(intRecord > price / point)をテストしてみました。

2013.04.04 14:27:38 TestSpeed-CompareDbls EURUSD,H4: MathAbs(a - b) HalfAPoint 99999999 times in 3403 ms.

2013.04.04 14:27:42 TestSpeed-CompareDbls EURUSD,H4: (intRecord > intCheck) 99999999 times in 2505 ms.

2013.04.04 14:27:40 TestSpeed-CompareDbls EURUSD,H4: intRecord > price /point 99999999 times in 1712 ms.しかし、3rdは、intRecord > price /point 99999999 times in 1712 ms.

しかし、3番目は実用に耐えないし、2番目(intRecord > intCheck)は比較前のintCheckのために1回多く代入されていました。


intRecord とは何ですか?
 
int intCheck "と同じだが、他の変数と同様、関数の 前に値を割り当てる。