2010-11-19 15 views
6

No entiendo lo siguiente que ocurre con el comando sprintf.Mostrando decimales de una variable con sprintf en MATLAB

>> vpa(exp(1),53) 

ans = 

2.7182818284590455348848081484902650117874145507812500 


>> e = 2.7182818284590455348848081484902650117874145507812500 

e = 

2.7183 

>> sprintf('%0.53f', e) 

ans = 

2.71828182845904550000000000000000000000000000000000000 

sprintf ¿Por qué me muestran el número e redondeado en lugar del número y me mantuvo en el primer lugar?

+0

Esto puede no tener nada que ver con su pregunta, pero si quiere los verdaderos dígitos de 'e' debe escribir en su lugar' vpa ('exp (1)', 53) ' – MarkV

+0

@MarkV: Sí, pero me gusta eso. ¡Gracias! – Peterstone

Respuesta

5

Las variables son double precision por defecto en MATLAB, por lo que la variable e que se crea se limita a la precisión de un doble, que está a unos 16 dígitos. Aunque haya ingresado más dígitos, un doble no tiene la precisión para representar con precisión todos esos dígitos adicionales y lo redondea al número más cercano que pueda representar.

EDIT: Como se explica con más detalle por Andrew Janke en su respuesta a this follow-up question he publicado, el número que ha elegido para e sólo pasa a ser una expansión decimal exacto del valor binario. En otras palabras, es el valor exactamente representable al que se redondearía un número cercano de coma flotante. Sin embargo, en este caso, nada más de aproximadamente 16 dígitos más allá del punto decimal no se considera significativo, ya que no se puede representar con precisión con un tipo de precisión doble. Por lo tanto, funciones como SPRINTF ignorarán automáticamente estos pequeños valores, imprimiendo ceros en su lugar.

+1

se saltó un paso: cuando se usa sprintf, e se convierte implícitamente en un doble. Las variables son ... – Marc

+1

@Marc: ¿Hm? Aquí, e ya es un doble porque está inicializado a partir de un literal debido a la copia y pegado. En Matlab, todos los literales numéricos producen valores dobles. Puede confirmarlo con "clase (2.7182818284590455348848081484902650117874145507812500)", que devuelve "doble". clase (exp (1)) es doble, también. La mayoría de los dígitos mostrados son falsos porque están más allá del límite de precisión del doble; vpa() simplemente no los pone a cero como lo hace printf(). –

+0

Tienes razón. Me perdí eso en el código. – Marc