Estoy tratando de comparar una matriz de dobles a un doble escalar para la igualdad, pero la igualdad nunca se reconoce bajo ciertas circunstancias. Sospecho que esto tiene que ver con la forma en que se representa el doble (por ejemplo, 1.0 vs 1.00), pero no puedo resolverlo.comparación doble de matlab
Por ejemplo, he generado una matriz compuesta de miles de valores dobles, el último pocos de los cuales en algún instante de tiempo se dan por
10.6000
-11.0000
10.2000
22.6000
3.4000
Si comprobar la igualdad de 10.2 (o 10.2000) por el comando array==10.2
(o array=10.2000
), devuelvo una matriz de 0. Si coloco los valores que se muestran en una matriz manualmente (por ejemplo, array=[10.6000 -11.0000 10.2000 22.6000 3.4000]
), el comando es exitoso (es decir, array==10.2
devuelve 0 0 1 0 0
). ¿Podría alguien explicar por qué la igualdad tiene éxito si ingreso los valores manualmente, pero falla si la matriz se genera en el contexto de un programa? Puedo rectificar el error de comparación utilizando una comparación aproximada en lugar de una exacta (por ejemplo, (array<10.20001) & (array>10.19999)
), pero esto parece insatisfactorio.
Editar: Los valores en la matriz se generan mediante la suma o resta iterativa de un doble constante (por ejemplo, 0.2
). El módulo de este conjunto por 0.2
debe estar por lo tanto en todas partes igual a 0
. De hecho, el módulo de cada elemento es igual a cualquiera de 0
o 0.2
, como se muestra a continuación para la secuencia anterior de los números en la matriz:
mod(array,0.2)
...
0.2000
0
0.2000
0.2000
0
De nuevo, si los valores se colocan en una matriz de forma manual y el módulo se toma, se obtiene el valor esperado de todos 0
s.
Muy útil. Una pregunta de seguimiento es que mis números se generaron sumando o restando una cantidad constante (por ej., '0.2') durante muchos ciclos en un bucle, así que matemáticamente los números en la matriz deberían ser 0 cuando el módulo 0.2 (' mod (matriz) , 0.2) ') se aplica. De hecho, ellos no lo son. Son iguales a 0 o 0.2. Sin embargo, por supuesto, cuando aplico el módulo 0.2 a cualquiera de los números en la matriz escribiéndolos manualmente, se da el valor esperado de 0. ¿Podrías explicar este comportamiento? ¡Gracias! – user001
Esto implica cómo se representan los números de coma flotante en las computadoras. Un hecho bien conocido es que las computadoras usan binario en lugar de decimal. Sin embargo, hay un problema con el binario, es decir, una fracción finita, digamos que 0,2 en decimal no se puede representar con dígitos finitos en binario. Es decir, la representación binaria de 0.2 en la computadora es en realidad 0.001110011100111 ..., que es interminable. Sin embargo, MATLAB usa 64 bits para representar un 'Single', que puede causar 2^(- 65) error. Este error es bastante pequeño, pero cuando hay bastantes iteraciones, puede acumularse. – grapeot
Maravillosa explicación. Muchas gracias. – user001