Fiyat != Fiyat ? - sayfa 4

 
rfb :
"int intCheck" ile aynı, ancak diğer değişkenler gibi işlevden önce atanan değer.

Yani bu işe yarayacak mı?

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

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

Yani bu işe yarayacak mı?

Tabii ki HAYIR, sadece piyasa fiyatları veya daha az haneli benzerleri için basit hesaplamalar içindir. Ondalık noktanın her iki tarafında birlikte sayılan 10 basamaktan fazlası varsa hiçbir şey çalışmaz, sınırlar. Sadece oyuncak.
 
rfb :
Tabii ki HAYIR, sadece piyasa fiyatları veya daha az haneli benzerleri için basit hesaplamalar içindir. Ondalık noktanın her iki tarafında birlikte sayılan 10 basamaktan fazlası varsa hiçbir şey çalışmaz, sınırlar. Sadece oyuncak.
Kodum gayet iyi çalışıyor.
 
WHRoeder :

İşleri fazla karmaşıklaştırma

Bir şeyin (veya bir fikrin) karmaşık mı yoksa karmaşık mı olduğu, bence, bireysel bir yorum meselesidir.

Kayan bölme, kayan toplama, int'ye dönüştürme, işlev çağrısı (kopyala, atla, dönüş = 3,) * 2 her zaman iki. (18) Ve bu, böl ve dönüştür'ün diğer işlemlerle eşit olduğunu varsayıyor - değiller.

Yarattığım ve kullandığım çözümün en verimli olduğunu asla önermek istemedim - olmayabilir de biliyorum. Ancak, önemli olan (1) ek genel giderlerini ve hesaplama maliyetlerini anlıyorum (ve şu anda tahammül edebiliyorum) ve (2) çifte kesinlikte olan iki fiyatı karşılaştırma sorununu (en azından benim için) çözüyor. kayan nokta biçimi.

Nihayetinde, çift duyarlıklı kayan nokta biçiminde olan iki gerçek sayıyı eşitlik için karşılaştırmanın doğasında var olan sorunu anlıyorum, ancak sanırım siz ve ben bu bağlamda soruna biraz farklı bir şekilde yaklaştık. İki ikilinin eşit olarak anlaşılacak kadar yakın olup olmadığını belirlemek için "epsilon karşılaştırması" diyebileceğim şeyi kullanırsınız - yani, iki ikili arasındaki fark maksimum sapmanız (Nokta / 2) içindeyse, o zaman iki çift eşittir. Öte yandan, Puan'a bölerek, en yakın tam sayıya yuvarlayarak, sonucu bir int olarak kaydederek ve ardından iki inç'i karşılaştırarak karşılaştırma için fiyatları int'e çevirmeyi seçiyorum. Satır içi kod yerine bir işlev çağrısı kullandım, çünkü bu benim için daha doğal - kodu alt rutinler/işlevler halinde gruplandırma eğilimindeyim - ve potansiyel olarak yeniden kullanılabilir olduğu için (belki de OOP terimleriyle düşünen o küçük parçamdan ). 16 Şubat 2012'de söylediklerinizin çoğunu aldım:

Aracının çifte değeri 1.2345750000000000 ile 1.2345849999999999999 arasında olabilir ve yine de aynı 1.23458 fiyat olarak kabul edilir.

Bu yüzden Nokta'ya böldükten sonra çifti int'ye çevirmeden önce ondalık kısmı kesmek yerine en yakın tam sayıya yuvarlamaya karar verdim.

Bütün bunlar yazdıklarınıza katılmadığım anlamına gelmiyor. Bunun yerine, gönderdiklerinizi gözden geçirdiğime ve ileride başvurmak üzere (ve gerekirse daha sonra potansiyel kullanım için) saklayacağıma dair bir onaydır. :)

Her zaman olduğu gibi, öğretici/yapıcı yorumlara açığız. :)

 
Thirteen :

Bir şeyin (veya bir fikrin) karmaşık mı yoksa karmaşık mı olduğu, bence, bireysel bir yorum meselesidir.

Yarattığım ve kullandığım çözümün en verimli olduğunu asla önermek istemedim - olmayabilir de biliyorum. Ancak, önemli olan (1) ek genel giderlerini ve hesaplama maliyetlerini anlıyorum (ve şu anda tahammül edebiliyorum) ve (2) çifte kesinlikte olan iki fiyatı karşılaştırma sorununu (en azından benim için) çözüyor. kayan nokta biçimi.


Size katılıyorum . . . ve ben de WHRoeder'a katılıyorum

Kodum, var olan kodu kırmadan veya saatlerce hata bulmak için harcamak zorunda kalmadan bir şeyin eklenmesi ihtiyacıyla yazılmıştı, bu yüzden amacına ulaştı. Ayrıca, WHRoeder'ın en azından kısmen yayınladıklarını dikkate almak ve yaptığımın daha iyi bir versiyonunu kullanırken, kullanımım için hala okunabilir halde tutmak istiyorum. Bunlardan herhangi birini becerebilirsem, bu konuya göndereceğim.

 
RaptorUK :

Bunlardan herhangi birini becerebilirsem, bu konuya göndereceğim.

Flat() işlevim WHRoeder'ın çözümünden 17 kat daha yavaştı, karşılaştırma türüne bağlı olarak daha okunaklı ve yalnızca 3 veya 4 kat daha yavaş olduğunu düşündüğüm bir teklifim var. 3 veya 4 kat daha yavaş elde etmek harika bir şey değil ama 17 kat daha yavaşla karşılaştırıldığında büyük bir gelişme. Biraz test ettim, henüz kapsamlı değil.

Kullanım:

 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" );

Karşılaştırma türleri, eşittir için EQ, eşit değil için NEQ, büyüktür için GT ve küçüktür için LT'dir.

 #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 );
      }
   }
 
Basitçe senin boollerin
 case GT: if ( FirstPrice - SecondPrice > HalfAPoint)
                   return ( true );
               else return ( false ); 
case GT: 
   return (FirstPrice - SecondPrice > HalfAPoint);
 
WHRoeder :
Basitçe senin boollerin

İyi bir nokta.

 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);
      
      }
   }

Performans önemli ölçüde değişmedi.

 
   case EQ:   return (! MathAbs (FirstPrice - SecondPrice) > HalfAPoint); // Initially missed the !
   case NEQ: return ( MathAbs (FirstPrice - SecondPrice) > HalfAPoint);
Öncelik kuralları Not (!) neredeyse en yüksektir: birinci != tam olarak ikinci olduğunda, (!ABS(sıfır olmayan) > nz) == (0 > nz) == false. f==s ise (!0 > nz) == (1 > p/2) == doğru ise nokta < 1
 
WHRoeder :
Öncelik kuralları Not (!) neredeyse en yüksektir: birinci != tam olarak ikinci olduğunda, (!ABS(sıfır olmayan) > nz) == (0 > nz) == false. f==s ise (!0 > nz) == (1 > p/2) == doğru ise nokta < 1

Evet, iyi yakaladın. . .

 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 );
      
      }
   }