2009-03-09 17 views
7

Aşağıdaki kod parçacığını vardır:EPS'de C ne anlama geliyor?

if (ABS(p43.x) < EPS && ABS(p43.y) < EPS && ABS(p43.z) < EPS) return(FALSE); 

C# için dönüştürmek çalışıyorum. "EPS" ne anlama geliyor?

Bu kod Numara "önemsiz olacak kadar küçük" olup olmadığını belirlemek için epsilon çeşit olacak

+0

Kare köklü bir sorunu çözmek için uğraşıyorum ve EPS kullanmam gerekiyor. Ama makroyu bulamıyorum. Şu anda Windows 7 x64 altında gg ve g ++ ile derleyerek cygwin kullanıyorum. Projemde hangi kütüphaneyi yer almalıyım? – Spidey

cevap

1

Epsilon ... Muhtemelen

Epsilon tipik şamandıra veya çift doğruluk sınırları içinde sıfıra çok yakın bir sayı belirtmek için kullanılır ... Bir #define olacaktır.

p43.x değerinin sıfıra yetecek kadar sıfıra yakın olup olmadığını belirlemek için kullanılır.

+3

Bah ... Birkaç saniye Skeeted var. –

+0

Ve ... Kod örneğinde yok. –

1

bu EPS Epsilon için olduğunu ki:

matematik (özellikle diş taşı) 'de

, bir isteğe bağlı olarak (veya hemen hemen bu), küçük pozitif bir miktar.

Eğer örnekte (ABS (p43.x) sonucu sıfıra yakın (kadar küçük ise) belirlemek için kullanılır.

8

EPS epsilondur. "Yakın yeterli" faktör.

soru "yeterince mutlak değer yakın?" nerede bazı az sayıda 1.0E-3 gibi genellikle bir şeydir "yeterince yakın".

algoritma Yanıta birleşir şekline bağlı olduğunu, performans bağlı olabilir EPS'nin boyutu, EPS'yi çok küçük yapmaya dikkat edin, çünkü işleminiz saatlerce (veya asırlar) koşar ve gerçekten kullanışlı bir cevap üretmez.

Bu durumda - döngü yokken - EPS kullanılır; çünkü kayan nokta sayısı çarpma sırasında küçük hataları toplar. Basitçe,

Bunu doğru söyleyemezsiniz. Bunun yerine her zaman Büyük olasılıkla

abs(a-b) <= EPS 
1

, p43 kayan nokta değerleri tutan bir yapı olduğunu söylüyor. Kayan nokta değerleri sonlu bir hassasiyete sahip olduklarından, yalnızca gerçek sayıların bir alt kümesini temsil edebilirler, bu da genellikle eşitliklerin yuvarlama hataları için bir kenar boşluğuyla kontrol edilmesi gerektiği anlamına gelir. Yerine x = 0 kontrol etme

, kod yani ]-EPS, +EPS[ tüm değerler 0 olacak kadar küçük kabul edilir |x| < EPS denetler.

Ayrıca, machine epsilon adresinden de okuma yapmayı düşünebilirsiniz.

2

Jon Skeet'in doğru olduğunu söyleyebilirim.Bu bu EPS 0.00001 sabit bir dizi olduğunu söyleyebilirim So

(setq nearzero 0.00001) 

: o sayfadaki lisp kodu bakarak aşağıdaki gibi tanımlanır 'nearzero' denilen hesaplamalarda benzer referans bulacaksınız.

1

C ve C++'da, sırasıyla float ve çift duyarlık için 1 + {FLT, DBL} _EPSILON> 1 gibi en küçük sayı olan önişlemci sabitleri FLT_EPSILON ve DBL_EPSILON'a sahipsiniz. Bu EPS, bazı benzer uygulamalara özel "sıfıra yakın" değeri gibi görünüyor.

+1

C99'a göre değil: makine epsilonu "kayan nokta türü verilen 'da gösterilebilen 1 ile en büyük değer arasındaki farktır"; bu değer yuvarlama modundan bağımsızdır (sizinki değil); Hatta yuvarlama yaparken, ~ 2 faktörü ile yanılıyorsunuz – Christoph