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

 
rfb:
int intCheck" と同じですが、他の変数と同じように関数の前に値を代入します。

それで、これは動作するのでしょうか?

intCheck = 1.1000000000001 /point;
intRecord = 1.0999999999999 /point;

if (intRecord > intCheck) Print("Prices are the same.");
 
RaptorUK:

これで大丈夫なのか?

もちろんNOです。これは、マーケットパースなど、桁数の少ない簡単な計算のためだけです。小数点以下の桁数が10桁を超えると、何もできなくなります。あくまで、おもちゃです。
 
rfb:
もちろん、桁数の少ないマーケットパースなどの簡単な計算にしか使えません。小数点以下の両端を合わせて10桁を超えると、何も動かなくなります。ただのおもちゃです。
私のコードは問題なく動きます。
 
WHRoeder:

物事を複雑にし過ぎない

何か(あるいは何らかのアイデア)が複雑かどうかは、個々の解釈の問題だと思う。

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

しかし、重要なことは、(1)私はその追加されたオーバーヘッドと計算コストを理解し(そして現時点では許容し)、(2)倍精度浮動小数点フォーマットの二つの価格を比較するという問題を(少なくとも私にとっては)解決している、ということです。

最終的に、私は倍精度浮動小数点フォーマットの2つの実数を等価比較することに内在する問題を理解していますが、あなたと私はこの文脈で少し異なる方法でこの問題にアプローチしていると思います。 あなたは、私が「イプシロン比較」と呼ぶものを使って、2つの倍数が等しいと理解できるほど近いかどうかを判断します--つまり、2つの倍数の差が最大偏差(ポイント / 2.)以内なら、その倍数2つは等しいとします。一方、私は価格を比較するために、Pointで割ってint型にし、小数点以下を丸め、結果をint型として保存し、2つのint型を比較する方法を選択しました。私はコードをサブルーチンや関数にまとめることが多いので、インラインコードではなく関数呼び出しを使用しました。 2012年2月16日にあなたが言ったことから多くを学びました。

ブローカーからの2倍値は、1.23457500000000から1.23458499999999のどこにあっても、同じ1.23458の価格とみなされます。

そのため、小数点以下は切り捨てず、小数点以下は四捨五入しています。

これは、あなたの投稿に反対しているのではなく、あなたが投稿した内容を確認し、将来の 参考のために(そして、必要に応じて後で使用するために)保存しておくことを認めているのです。)

いつも通り、有益なコメントや建設的なコメントを歓迎します。:)

 
Thirteen:

何か(あるいは何かアイデア)が複雑かどうかというのは、個々の解釈の問題だと思うんです。

しかし、重要なことは、(1)私はその追加されたオーバーヘッドと計算コストを理解し(そして現時点では許容し)、(2)倍精度浮動小数点フォーマットの二つの価格を比較するという(少なくとも私にとっては)問題を解決することです。


私は、あなたの意見に賛成です。そして、WHRoederの 意見にも賛成です。

私のコードは、既存のコードを壊すことなく、またバグを見つけるのに何時間も費やすことなく、既存のコードにプラグインできるものを必要として書かれました。 私は、WHRoederが 投稿したことを少なくとも部分的に取り入れ、私がやっていることを、私の使用のために読みやすく保ちながら、より良いバージョンを考え出したいと思います。 もし、何かできたなら、このスレッドにそれを投稿します。

 
RaptorUK:

もし、このうちのどれかがうまくいったら、このスレッドに投稿します。

私の Flat()関数はWHRoeder の解決策 より 17 倍も遅かったのですが、より読みやすく、比較のタイプによっては 3、4 倍しか遅く ならない提案があります。 3、4 倍の遅さは達成するには素晴らしいことではありませんが、17 倍と比べると大きな改善です。 まだ広範囲ではありませんが、少しテストしています。

使い方を説明します。

bool Compare(double FirstPrice, int ComparisonType, double SecondPrice)


for example:

if(Compare(Bid, LT, Ask)) Print("Bid is less than Ask");

if(Compare(Price, EQ, Price)) Print("Price does equal Price");

比較のタイプは、EQは等しい、NEQは等しくない、GTはより大きい、LTはより小さいです。

#define LT    0
#define GT    1
#define EQ    2
#define NEQ   4


bool Compare(double FirstPrice, int ComparisonType, double SecondPrice)
   {
   double HalfAPoint = Point / 2.0;
   

   switch(ComparisonType)
      {
      case LT: if ( SecondPrice - FirstPrice > HalfAPoint)
                  return(true);
               else return(false); 
      
      case GT: if ( FirstPrice - SecondPrice > HalfAPoint)
                  return(true);
               else return(false); 
      
      case EQ: if (MathAbs(FirstPrice - SecondPrice) > HalfAPoint)
                  return(false);
               else return(true); 
      
      case NEQ: if (MathAbs(FirstPrice - SecondPrice) > HalfAPoint)
                  return(true);
               else return(false);
      }
   }
 
単純にあなたのブール
case GT: if ( FirstPrice - SecondPrice > HalfAPoint)
                  return(true);
               else return(false); 
case GT: 
   return(FirstPrice - SecondPrice > HalfAPoint);
 
WHRoeder:
単にあなたのbools

良い点

bool Compare(double FirstPrice, int ComparisonType, double SecondPrice)
   {
   double HalfAPoint = Point / 2.0;
   

   switch(ComparisonType)
      {
      case LT: return( SecondPrice - FirstPrice > HalfAPoint);
      
      case GT: return( FirstPrice - SecondPrice > HalfAPoint);
      
      case EQ: return(!MathAbs(FirstPrice - SecondPrice) > HalfAPoint);
      
      case NEQ: return(MathAbs(FirstPrice - SecondPrice) > HalfAPoint);
      
      }
   }

性能は大きく変わっていない。

 
  case EQ:  return(!MathAbs(FirstPrice - SecondPrice) > HalfAPoint); // Initially missed the !
  case NEQ: return( MathAbs(FirstPrice - SecondPrice) > HalfAPoint);
優先順位規則 Not (!) がほぼ最高:1番目 != 2番目の正確なとき、 (!ABS(non-zero) > nz) == (0 > nz) ==false. f==sなら(!0 > nz) == (1 > p/2) == point < 1ならtrue。
 
WHRoeder:
優先順位規則 Not (!) がほぼ最高:1番目 != 2番目の正確なとき、 (!ABS(non-zero) > nz) == (0 > nz) ==false. f==s ならば (!0 > nz) == (1 > p/2) == true if point < 1

はい、良いキャッチです ... ...

bool Compare(double FirstPrice, int ComparisonType, double SecondPrice)
   {
   double HalfAPoint = Point / 2.0;
   

   switch(ComparisonType)
      {
      case LT: return( SecondPrice - FirstPrice > HalfAPoint );
      
      case GT: return( FirstPrice - SecondPrice > HalfAPoint );
      
      case EQ: return(!( MathAbs(FirstPrice - SecondPrice) > HalfAPoint ) );
      
      case NEQ: return( MathAbs(FirstPrice - SecondPrice) > HalfAPoint );
      
      }
   }