价格!=价格? - 页 4

 
rfb:
和 "int intCheck "一样,但在函数前分配值,就像其他变量一样。

那么,这样做能行吗?

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

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

因此,这将是可行的?

当然不是,它只适用于市场指数或类似的较少数字的简单计算。如果小数点两边的数字超过10位,那就没有用了。这只是一个玩具。
 
rfb:
当然不是,它只适用于市场指数或类似的较少数字的简单计算。如果小数点两边的数字超过10位,则没有任何作用。只是玩具而已。
我的代码工作得很好。
 
WHRoeder:

不要把事情过分复杂化

我认为,一件事(或一些想法)是否复杂,是个人解释的问题。

一个浮动除法,浮动加法,转换为int,函数调用(复制,跳转,返回=3,)*2都乘以2。(18) 而这是假设除法和转换与其他操作相提并论--它们并不是。

我从来没有想过我创建和使用的解决方案是最有效的--我意识到它可能不是。 但是,重要的是(1)我理解(并且在这个时候,可以容忍)它的额外开销和计算成本;(2)它解决了比较两个双精度浮点格式的价格的问题(至少对我来说)。

归根结底,我理解比较两个双精度浮点格式的实数是否相等的内在问题,但我认为在这种情况下,你和我处理问题的方式略有不同。 你使用我称之为 "ε比较 "的方法来确定两个双数是否足够接近,可以理解为相等--也就是说,如果两个双数的差异在你的最大偏差(点/2.)之内,那么这两个双数就相等。另一方面,我选择将价格转化为整数,通过除以Point进行比较,四舍五入到最接近的整数,将结果保存为整数,然后比较这两个整数。我使用了一个函数调用,而不是内联代码,因为它对我来说更自然--我倾向于将代码归入子程序/函数--而且因为它有可能被重用(也许是来自我的那一小部分以OOP术语思考的人)。 我从你在2012年2月16日所说的话中得到很多。

经纪人的双倍值可以从1.23457500000000到1.234584999999999的任何地方,仍然被认为是相同的1.23458价格。

这就是为什么我决定四舍五入到最接近的整数,而不是在除以点之后但在将双数转换为int之前截断小数部分。

所有这些并不是说我不同意你所发布的内容,而是承认我已经审查了你所发布的内容,并将其保存起来供将来 参考(如果需要,以后可能会用到)。

一如既往,我们欢迎有指导性/建设性的评论。:)

 
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);
优先规则 不(!)几乎是最高的:当第一!=第二正好,(!ABS(非零)>nz)==(0>nz)==假。 如果f==s,那么(!0>nz)==(1>p/2)==真,如果点<1
 
WHRoeder:
优先规则 不(!)几乎是最高的:当第一!=第二正好,(!ABS(非零)>nz)==(0>nz)==假。 如果f==s,那么(!0 > nz) == (1 > p/2) == true 如果点 < 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 );
      
      }
   }