가격 수 != 가격 ? - 페이지 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) 배정밀도로 두 가격을 비교하는 문제(적어도 저에게는)를 해결한다는 것입니다. 부동 소수점 형식.

궁극적으로 배정밀도 부동 소수점 형식의 두 실수를 동등하게 비교하는 데 내재된 문제를 이해하지만 이 맥락에서 여러분과 저는 약간 다른 방식으로 문제에 접근했다고 생각합니다. 내가 "엡실론 비교"라고 부를 수 있는 것을 사용하여 두 개의 복식이 같은 것으로 이해될 만큼 충분히 가까운지 결정합니다. 두 개의 더블은 동일합니다. 반면에 나는 Point로 나누어서 비교를 위해 int로 변환하고 가장 가까운 정수로 반올림하여 결과를 int로 저장한 다음 두 int를 비교하도록 선택합니다. 나는 인라인 코드보다 함수 호출을 사용했는데, 왜냐하면 그것이 나에게 더 자연스럽고(저는 코드를 서브루틴/함수로 그룹화하는 경향이 있음) 잠재적으로 재사용 가능하기 때문입니다(아마도 OOP 용어로 생각하는 내 작은 부분에서 ). 나는 당신이 2012년 2월 16일에 말한 것에서 많은 것을 얻었습니다.

중개인의 두 배 값은 1.23457500000000000에서 1.2345849999999999 사이일 수 있으며 여전히 동일한 1.23458 가격으로 간주됩니다.

그래서 Point로 나눈 후 double을 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 :
단순히 당신의 부울

좋은 지적.

 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(!)이 거의 가장 높습니다. 첫 번째 != 두 번째가 정확히 같을 때 (!ABS(non-zero) > nz) == (0 > nz) == false입니다. f==s이면 (!0 > nz) == (1 > p/2) == 점이 <1이면 참
 
WHRoeder :
우선순위 규칙 Not(!)이 거의 가장 높습니다. 첫 번째 != 두 번째가 정확히 같을 때 (!ABS(non-zero) > nz) == (0 > nz) == false입니다. f==s이면 (!0 > nz) == (1 > p/2) == 점이 <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 );
      
      }
   }