2010-11-02 10 views
5

Duplicar posibles:
Numeric comparison difficulty in RPrimer círculo de R infierno. 0,1 = 0,3/3

Hola a todos,

Según "R Inferno" papel. Estoy ahora en el primer círculo del infierno R Aquí es donde los paganos esperan 0.1 == 0.3/3. Paper recomienda utilizar la función all.equal para estos casos; sin embargo, debo verificar las condiciones "> =" o "< =". Con el ejemplo actual de ellos fracasan:

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

¿Hay una función similar a all.equal que comprueba las desigualdades?

Gracias,

Ilya

+3

Eso no es un error específico de I, pero un error común que es causada por la representación binaria de los números de punto flotante. Ver http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems por ejemplo. – schnaader

+0

Sé por qué ocurre un error. Me gustaría saber si hay una función R que puede verificar las desigualdades o si necesito escribir una con los puntos flotantes en mente. – ilya

+0

sí, necesito hacer mejores búsquedas – ilya

Respuesta

7

ver estas preguntas:

En términos generales, se puede hacer frente a este mediante la inclusión de un nivel de tolerancia de acuerdo con el segundo enlace anterior.

+0

Vea el segundo enlace que responde directamente a la pregunta. – Shane

+0

Gracias Shane, en el segundo enlace encontré tu publicación con la creación de un nuevo operador, exactamente lo que quería. ¡¡Gracias!! – ilya

+0

@ilya ¡Me alegra que pudiéramos ayudar! – Shane

4

Por favor ver el R FAQ entry Why doesn't R think these numbers are equal y las referencias en él.

+1

Esto es fascinante, pero no una respuesta para el OP. – mob

+3

Claro está, o lees otra entrada 7.31. El ejemplo que hay 'sqrt (2) * sqrt (2) == 2' sale como FALSO y es el mismo problema aquí: representación de los números de coma flotante. –

2

Podría intentar el uso juicioso de zapsmall() que parece funcionar según el comportamiento que está buscando. No sé si esto funciona en todas las situaciones. por ejemplo,

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

La prueba principal de all.equal es si abs(x-y) < tolerance para algunos valores x y y y algunos pequeños tolerance. pruebas de desigualdad equivalentes comprobarían:

x <= y:   x-y < tolerance 
x < y:   x-y < -tolerance 
x >= y:   x-y > -tolerance 
x > y:   x-y > tolerance 
Cuestiones relacionadas