De ce aș folosi complementul lui 2 pentru a compara două duble în loc să compare diferențele lor cu o valoare epsilon?

Referenți aici și aici ... De ce aș folosi complementul celor doi pe o metodă epsilon? Se pare că metoda epsilon ar fi suficient de bună pentru majoritatea cazurilor.


Update: I'm purely looking for a theoretical reason why you'd use one over the other. I've always used the epsilon method.

A folosit cineva comparația complementului 2 cu succes? De ce? De ce nu?

0

6 răspunsuri

Oskar are dreptate. Nu te înșuruba cu asta dacă nu ai nevoie de performanță.

Și tu nu. Dacă v-ați afla în situația care a făcut-o, nu ar fi trebuit să întrebați - ați știut deja. Dacă credeți că faceți asta, atunci nu faceți asta. Problemele de performanță se află în altă parte. Utilizați versiunea ușor de citit.

0
adăugat

Metoda biților ar putea fi mai rapidă. Spun ca ar putea ca, datorita procesoarelor moderne (multicore, foarte bine conectate), este adesea imposibil sa ghicesti ceea ce este cu adevarat mai rapid. Codificați implementarea cea mai simplă, cea mai simplă, corectă, apoi măsurați, apoi optați.

0
adăugat

Când vine vorba de viteză, urmați aceste reguli:

  1. Dacă nu sunteți un dezvoltator foarte experimentat, nu optimizați.
  2. Dacă sunteți un dezvoltator cu experiență, nu optimizați încă.

Faceți cea mai ușoară metodă.

Alex

0
adăugat
Ce legătură are asta cu ceea ce cer? Vreau să știu de ce folosești o abordare față de alta, nu dacă să optimizezi nimic.
adăugat autor Steve Duitsman, sursa

al doilea link pe care îl menționați menționează un articol care are o descriere destul de lungă a problemei:

http://www.cygnus-software.com/papers/comparingfloats/comparingfloats. htm

dar dacă nu vă îmbunătățiți performanța aș rămâne cu epsilon, astfel încât oamenii să vă poată depana codul

0
adăugat
Deci răspunsul scurt ... performanța este mai bună în comparație cu epsilonul?
adăugat autor Steve Duitsman, sursa
Sunt de acord cu tine. Dacă nu altceva, lizibilitatea ar trebui să fie prima mea preocupare.
adăugat autor Steve Duitsman, sursa
rețineți că performanța poate fi mai proastă utilizând metoda integer bit-twiddling, deoarece mișcarea bitstream între registrele cu virgulă mobilă și cele întregi nu este o operație rapidă (în funcție de setul de cip și de instrucțiuni utilizat). Aș evita asta dacă nu sunteți absolut sigur că aveți nevoie de performanța suplimentară și nu puteți să o obțineți (de exemplu) prin simpla alegere a unui epsilon absolut inteligent.
adăugat autor Eamon Nerbonne, sursa
Nu știu. Nu aș folosi nimic atât de complex pentru o comparație, decât dacă compararea numerelor era partea principală a aplicației mele. Imaginați-vă că operatorul de timp depanează o tipografie simplă ...
adăugat autor Oskar, sursa

Pe scurt, atunci când se compară două flotoare cu origini necunoscute, alegerea unui epsilon care este valabilă este aproape imposibilă.

De exemplu:

Care este un epsilon bun când se compară distanța în mile între Atlanta GA, Dallas TX și un loc în Ohio?

Care este un epsilon bun când se compară distanța în mile între piciorul stâng, piciorul drept și calculatorul sub biroul meu?

EDIT:

Ok, primesc un număr destul de de oameni care nu înțeleg de ce nu știi ce epsilon e.

Înapoi în zilele vechi ale lorelor, am scris două programe care au lucrat cu NeverWinter Nights (un joc făcut de BioWare). Unul dintre programe a luat un model binar și la transformat în ASCII. Celălalt program a luat un model ASCII și la compilat în binar. Unul dintre testele pe care le-am scris a fost să iau toate modelele binare ale lui BioWare, să le decompilați la ASCII și apoi să reveniți la binar. Apoi am comparat versiunea binară cu versiunea originală de la BioWare. Una dintre problemele care au avut loc în timpul comparației a fost rezolvarea unor ușoare variații ale valorii în virgulă mobilă. Deci, în loc de a veni cu o grămadă de EPSILONS diferite pentru fiecare tip de număr de virgulă mobilă (vertex, normal, etc), am vrut să folosesc ceva de genul asta, comparativ cu două comparații. Astfel evitând întreaga problemă EPSILON multiplă.

Același tip de problemă se poate aplica pentru orice tip de software care procesează date terță parte și apoi trebuie să-și valideze rezultatele cu originalul. În aceste cazuri s-ar putea să nu știți nici măcar ce reprezintă valorile cu virgulă mobilă, trebuie doar să le comparați. Am intrat în această problemă cu software-ul nostru de automatizare industrială.

EDIT:

LOL, acest lucru a fost votat în sus și în jos de către diferiți oameni.

Voi fierb la această problemă, având în vedere două numere cu număr variabil , cum decideți ce epsilon să utilizați? Nu poţi.

Cum puteți compara 1e23 și 1.0001e23 cu un epsilon și comparați încă 1e-23 și 5.2e-23 utilizând același epsilon? Sigur, puteți face unele trucuri epsilon dinamice, dar acesta este întregul punct pentru compararea întregului (care NU necesită exactitate întregi).

Comparația întregului este capabilă să compare două flotoare folosind un epsilon relativ la amploarea numerelor.

EDIT

Steve, permiteți să vedeți ce ați spus în comentariile:

"Dar știi ce înseamnă egalitatea pentru tine ... Prin urmare, ar trebui să poți găsi un epsilon potrivit".

Transformați această declarație în jur pentru a spune:

"Dacă știi ce înseamnă egalitatea pentru tine, atunci ar trebui să găsești un epsilon potrivit".

Întregul punct la ceea ce încerc să spun este că există aplicații în care nu știm ce înseamnă egalitate în sensul absolut, astfel că trebuie să recurgem la o comparație relativă care este ceea ce încearcă să facă întreaga versiune.

0
adăugat
Dar știi ce înseamnă egalitatea pentru tine ... și codul tău este cel care le compară. Prin urmare, ar trebui să găsiți un epsilon potrivit.
adăugat autor Steve Duitsman, sursa
Epsilon funcționează în domeniul problemei, dacă scrieți un satnav pentru a vă obține de la Dalls-Atlanta epsilon este incertitudinea în GPS
adăugat autor Martin Beckett, sursa
Asta este adevărat, dar punctul meu este că atunci când nu aveți nici un cadru de referință cu privire la originea plutelor, alegerea unui epsilon ar fi foarte greu.
adăugat autor Torlack, sursa

Using any method that compares bitwise will result in trouble when fractions are represented by approximations. All floating point numbers with fractions that are not denominated in powers of two (1/2, 1/4, 1/8, 1/65536, &c) are approximated. So, of course, are all irrational numbers.

float al treilea = 1/3; float două = 2,0; float alt_two = a treia * 6.0; dacă (doi! = alt_two)    print ("Apropiere! \ n");

Singurul timp în care se compară biți ar fi atunci când obțineți numerele cu puncte variabile exact în același fel sau sunt reprezentări exacte (numere întregi, puteri fracționare a două). Chiar și atunci, pot exista mai multe reprezentări ale unor numere, deși nu am văzut acest lucru într-un sistem de lucru.

0
adăugat
Nici eu, de aceea sunt curios.
adăugat autor Steve Duitsman, sursa