2010-11-02 5 views
5

Mögliche Duplizieren:
Numeric comparison difficulty in RErster Kreis der Hölle. 0,1 = 0,3/3

Hallo alle,

Nach "R Inferno" Papier. Ich bin gerade im ersten Kreis der Hölle. Hier erwarten die Heiden 0,1 == 0,3/3. Paper empfiehlt die Verwendung der all.equal Funktion für solche Fälle, jedoch muss ich die Bedingungen "> =" oder "< =" überprüfen. Mit aktuellem Beispiel an ihnen scheitert:

> .1 >= .3/3 
[1] TRUE 
> .1 <= .3/3 
[1] FALSE 

Gibt es eine ähnliche Funktion wie all.equal, die Ungleichungen prüft?

Danke,

Ilya

+3

Das ist kein R spezifischer Fehler, aber ein allgemeiner Fehler, der durch die binäre Darstellung von Fließkommazahlen verursacht wird. Siehe http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems zum Beispiel. – schnaader

+0

Ich weiß, warum ein Fehler auftritt. Ich würde gerne wissen, ob es eine R-Funktion gibt, die Ungleichungen überprüfen kann oder ich muss eine mit Gleitkommazahlen schreiben. – ilya

+0

ja, ich muss bessere Suchen tun – ilya

Antwort

7

Sehen Sie diese Fragen:

Generell Sie mit dieser, indem ein Toleranzniveau gemäß dem zweiten Link oben umgehen können.

+0

Siehe den zweiten Link, der direkt die Frage beantwortet. – Shane

+0

Vielen Dank Shane, in zweiten Link fand ich Ihren Beitrag mit der Erstellung neuer Operator - genau das, was ich wollte. Vielen Dank!! – ilya

+0

@ilya Froh wir könnten helfen! – Shane

4

Bitte beachten Sie die R FAQ entry Why doesn't R think these numbers are equal und die Referenzen darin.

+1

Das ist faszinierend, aber keine Antwort auf das OP. – mob

+3

Sicher ist, oder Sie lesen einen anderen Eintrag 7.31. Das Beispiel dort ist 'sqrt (2) * sqrt (2) == 2 'kommt als FALSCH heraus und ist das gleiche Problem hier: Darstellung von Fließkommazahlen. –

2

Sie könnten eine vernünftige Verwendung von zapsmall() versuchen, die das Verhalten zu geben scheint, das Sie suchen. Ich weiß nicht, ob das in allen Situationen funktioniert. z.B.

.1 >= zapsmall(.3/3) 
[1] TRUE 
> .1 <= zapsmall(.3/3) 
[1] TRUE 
8

Die Hauptprüfung von all.equal ist, ob abs(x-y) < tolerance für einige Werte x und y und einige kleine tolerance. Gleichwertige Ungleichheitsprüfungen würden prüfen: