April 27, 2018

Selam

Diyelimki bir float veya double sayısını bir ilintili dizide kullanmam lazım.

Normalde double ve float 'u hash sorunlarından dolayı bu tür veri yapılarında kullanılmaması gerektiğini biliyorum.

Fakat benim anahtar olarak kullanıcağım değer bir epsilon değerinden daha küsüratlı olmayacak. Örneğin kesirli haneler 7 haneden daha çok gitmeyecek.

Acaba aşağıdaki gibi bir tür yaratıp bunu anahtar olarak kullanmak doğrumudur ?


int[PreciseDouble] acabaBuDoğrumu;

struct PreciseDouble
{
	enum PRICE_EPSILON = 0.00000001;

   double val;
   size_t toHash() const
   {
		return cast(size_t)(this.val*(1.0/PRICE_EPSILON));
   }

   bool opEquals(ref const PreciseDouble rhs) const
   {
       return (rhs.val - this.val) < PRICE_EPSILON;
   }
}

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 29, 2018

Yanılmıyorsam, epsilon gibi bir değere dayanan algotirmalar ancak bazı değer aralıklarında güvenilirdir. Öyle mutlak bir değer yerine, karşılaştırılan değerlerden yüzde bilmem kaç gibi bir epsilon daha uygun olabilir. Zor konular... :) D'de approxEqual'a bakabilirsin:

https://dlang.org/phobos/std_math.html

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]