Şamandıraları karşılaştırırken, fark eşiğine ne denir?


10

Şu anda Java'da şamandıraları karşılaştırıyorum ve en basit formül:

Math.abs(a - b) < THRESHOLD

Değişkeninize fark eşiğini adlandırırken, bunu delta veya epsilon olarak mı adlandırmalısınız? Özellikle, kayan nokta sayısının temsil edebileceği en küçük değer için bu terimlerden hangisi doğru terimdir?

Programlama dili terimi belirli mi, yoksa diller arasında evrensel mi?


1
Alternatif terimler: "hassasiyet", "çözünürlük". Bunları tam olarak beğendim;) çünkü aşırı teknik gelmiyorlar.
stakx

1
Konu dışı: Kayan Nokta Kılavuzu önerir karşı yakın eşitlik karşılaştırılması bu tür kullanarak.
stakx

1
@stakx - önerdiğiniz terimler yanlış ve OP'nin ne istediğinden farklı anlamları var. Soru evet ayrıntılı, ancak edilir dış referans üzerine sorumlu tabanlı ve kayan nokta değerleri ile uğraşırken programlamaya alaka var. Yapıcı ve konu üzerine.

1
@ GlenH7: Asla sorunun iyi bir soru olmadığını ya da cevaplanamayacağını söylemedim. Aslında, onu onaylayan bendim. Ve önerdiğim (kuşkusuz daha az kesin) terimlerin yanlış olduğunu iddia ettiğiniz için, bunun neden böyle olduğunu öğrenmek isterim .
stakx

@stakx - kapatmaya oy verdiğinizi ima ettiğiniz için özür dileriz. Şu anda soruya verilen dört yakın oylamaya daha fazla tepki veriyordum.

Yanıtlar:


18

Matematik ve mühendislikte Epsilon

Genel olarak matematik ve mühendislikte:

  • Delta genellikle herhangi bir ölçekte olabilen bir farkı ifade etmek için kullanılır.
  • Epsilon genellikle ihmal edilebilir bir miktara atıfta bulunur.

ve epsilon sizin durumunuzda daha uygun görünüyor.


Bilgisayar Biliminde Epsilon

Özellikle bilgisayar biliminde, epsilon terimi, arasındaki farkı ve kesinlikle daha büyük olan en küçük şamandırayı ölçen makine espilonunu da ifade eder . Bu son sayı Java'daki şamandıralar içindir ve şunlarla hesaplanabilir:1.0f1.0f1.00000011920928955078125f

float f = Float.intBitsToFloat(Float.floatToIntBits(1f) + 1);

Makine epsilonunun tanımı, yukarıda açıklanan epsilonun genel kullanımı ile tutarlıdır.


Şamandıraların karşılaştırılması

Ancak şamandıraları "yakınlık" için karşılaştırmadan önce ölçekleri hakkında bir fikriniz olması gerektiğini unutmayın. İki çok büyük ve sözde çok farklı şamandıra eşit olabilir:

9223372036854775808f == 9223372036854775808f + 1000000000f; //this is true!

Ve tersine, makine epsilonundan "sadece" farklı iki küçük şamandıra arasında birçok olası şamandıra değeri (ve birkaç büyüklük sırası) olabilir. Aşağıdaki örnekte, smallve arasında 10.000.000 kullanılabilir kayan değer vardır f, ancak aralarındaki fark hala makine epsilonunun oldukça altındadır:

float small = Float.MIN_VALUE; // small = 1.4E-45
float f = Float.intBitsToFloat(Float.floatToIntBits(small) + 100000000); // f = 2.3122343E-35
boolean b = (f - small < 0.00000011920928955078125f); //true!

GlenH7'nin cevabında yer alan makale, şamandıra karşılaştırmasını daha fazla araştırıyor ve bu sorunların üstesinden gelmek için çeşitli çözümler öneriyor.


2
-1: Bilimsel hesaplama yazılımında Epsilon, Makine epsilonuna veya Göreli epsilon'a atıfta bulunur (aynı makaleye bakın). Genellikle, bu yuvarlama hataları nedeniyle, yaklaşık eşitliği kabul kullanılan aynı miktar değil katları makine epsilon veya göreceli epsilon arasında ve ondan daha büyük büyüklüklerinin genellikle birkaç sırası.
rwong

1
@rwong Bu, epsilon teriminin bir uzmanlığıdır ve daha birçokları vardır. Genel olarak mühendislikte, epsilon küçük bir miktar veya hatayı ifade eder ve Machine epsilon bu fikirle uyumludur.
assylias

@assylias, standart tanımın anlamlı olduğu bir bağlamda standart bir tanımı olan bir ad kullanarak, ancak standart tanıma karşılık gelmeyen bir şey için sorunların makbuzudur.
AProgrammer

@AProgrammer Epsilon'un genel tanımının bilgi işlem için geçerli olmadığına katılmıyorum.
assylias

1
@assylias: açıklama için teşekkürler. -1'i kaldırdım.
rwong

16

Matematikte delta, bir değerden bazı farklılıkları temsil etmek için, epsilon ise keyfi bir hata değerini temsil etmek için kullanılır. Bu durumda, epsilon geleneksel isim olacaktır.


8

Sorunuzu doğrudan yanıtlamak için terimi kullanmak istiyorsunuz epsilon. Daha doğrusu, machine epsilonyaygın kullanım "makine" düşer ve sadece kullanır epsilon.

float.hGördüğüm yerel kopyama bakıyorum :

#define DBL_EPSILON     2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON != 1.0 */  
#define FLT_EPSILON     1.192092896e-07F        /* smallest such that 1.0+FLT_EPSILON != 1.0 */  
#define LDBL_EPSILON    DBL_EPSILON             /* smallest such that 1.0+LDBL_EPSILON != 1.0 */

İlişkili yorumlar, epsilon'un bahsettiğiniz terim olduğunu açıkça ortaya koymaktadır.

Ancak epsilon, bunun doğru terim olduğunu doğrulamak için başka harici referanslara da güvenebiliriz . Bkz burada , burada , burada ve son olarak bu kombinasyon SO sorgusu etiketi . Alıntı yapmak için IEEE 754 standardına doğrudan bir referans bulamadım.


Siz sormadınız, ancak sorunuzu netleştirmek için verdiğiniz örnekle çok alakalı olan bu referansı buldum.

Valve'den Bruce Dawson'ın bu blog makalesine, önerdiğiniz karşılaştırmayı neden kullanmak istemediğinize dair kayar nokta değerlerini karşılaştırma konusunda bir göz atın .

Bu makalede bir miktar bilgi var, ancak oradan en alakalı snipppet:

Şamandıraları eşitlik için karşılaştırmak kötü bir fikirse, farklılıklarının bazı hata sınırları veya epsilon değerinde olup olmadığını kontrol etmeye ne dersiniz:

bool isEqual = fabs(f1 – f2) <= epsilon;

Bu hesaplama ile, iki şamandıra kavramını eşit olarak değerlendirmek istediğimiz kadar yakın olduğunu ifade edebiliriz. Peki epsilon için hangi değeri kullanmalıyız?
Yukarıdaki deneylerimiz göz önüne alındığında, toplamda yaklaşık 1.19e-7f olan hatayı kullanmaya cazip gelebiliriz. Aslında float.h dosyasında bu tam değere sahip bir tanım bile vardır ve buna FLT_EPSILON denir.
Açıkçası bu kadar. Başlık dosyası tanrıları konuştu ve FLT_EPSILON tek gerçek epsilon olduğunu!
Bunun dışında çöp. 1.0 ve 2.0 arasındaki sayılar için FLT_EPSILON bitişik kayan noktalar arasındaki farkı temsil eder. 1.0'dan küçük sayılar için FLT_EPSILON epsilonu hızla çok büyür ve yeterince küçük sayılarla FLT_EPSILON karşılaştırdığınız sayılardan daha büyük olabilir!

Dawson, şamandıraları karşılaştırırken ve bunun gibi çok küçük değerlerle uğraşırken yaşanan karışıklıklarla ilgili diğer birkaç düşünceyi gözden geçiriyor, bu yüzden yazılarının geri kalanını okumanızı teşvik ediyorum.


Cevabınızın ilk bölümünü açıklığa kavuşturmak isteyebilirsiniz: Bruce'un makalesi, bir kişinin tolerans karşılaştırması için neden sabit bir epsilon (başlık dosyasında tanımlananlar gibi) kullanmaması gerektiğini zaten açıklamaktadır. Ayrıca, birçok durumda, birkaç milyon ULP'nin hatası endişelenecek bir şey değildir, çünkü çoğu uygulamada, önemli basamakları en az anlamlı basamaklardaki hatalardan daha fazla önemsiyoruz, çünkü çift hassasiyet zaten verir önemsediğimizden daha fazla basamak.
rwong

@rwong - okuduğumda soru, sabitin adı için kullanılacak doğru terimi tanımlamaktı. Bu yüzden epsilon işlemek için float.h referansını birkaç tane daha verdim. Dawson'ın makalesi, IEEE 754 referansını ararken bulduğum bir şey ve simplest formulakarşılaştırma için OP'lerle ilgili olduğunu düşündüm . Birçoğu bu yaklaşımı ilk girişim olarak kullanıyor ve ben Dawson'un makalesini ekledim, çünkü karşılaştırmanın ne kadar zor olduğu konusunda nüanslara giriyor. Bu yüzden soruyu doğrudan cevaplamaya çalıştım ve sonra neden bu şekilde kullanmamaya dikkat çektim.

5

Bu bir hata fonksiyonudur; mutlak hata genellikle bir miktar x için ε (epsilon) veya Δ x olarak adlandırılır :

ε = | beklenen - gerçek |

Δ x = | x 0 - x  |

Bağıl hata bazen η (eta) olarak adlandırılır :

η = | 1 - gerçek / beklenen |

Programlama amaçları için absoluteErrorve relativeError(veya bazı kısaltmaları) daha açıklayıcıdır. Hatanın belirli bir değerden daha az olduğunu iddia etmek istiyorsanız, bu değere basitçe bir eşik veya tolerans denir .

Görmek:


3

Buna "hoşgörü" derdim.

Belki bu matematiksel olarak doğru terim değildir, ancak soruyu sormanızın sırrı bana "delta" ne de "epsilon" un iyi bir değişken ismi olmayacağı anlamına gelir.

Deneyimlerime göre, kodu gerçekten okuyanlar için anlamlı olan tanımlayıcı adlarını kullanmak daha iyidir. Okuyucunun ne anlama geldiğini anlamak için Wikipedia'ya bakması gerektiği anlamına gelirse, mükemmel bir isim ne işe yarar?


+1. Umarım insanlar iş arkadaşlarına bu adlandırma sorularını sormayı ve burada yayınlamayı ister.
MarkJ

6
-1, kuralları önlemek daha onlardan öğrenmek daha iyidir.
djechlin

+1 çünkü bu soruyu yayınlamamın nedeni de aynı.
Ağustos'ta NobleUplift
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.