Esta pregunta surgió de algo extraño que me di cuenta después de investigar this question más ...En MATLAB, ¿las variables REALMENTE son de doble precisión por defecto?
siempre entendí variables de MATLAB para ser double-precision por defecto. Así que, si tuviera que hacer algo como declarar una variable con 20 dígitos después del punto decimal:
>> num = 2.71828182845904553488;
>> class(num) %# Display the variable type
ans =
double
Yo esperaría que los últimos 4 dígitos para ser ignorado, ya que el floating-point relative accuracy es del orden de 10 -16 :
>> eps(num)
ans =
4.440892098500626e-016
Si trato de mostrar el número con más de 16 dígitos después del punto decimal (usando FPRINTF o SPRINTF), que consiga lo que esperaba ver:
>> fprintf('%0.20f\n',num)
2.71828182845904550000
>> sprintf('%0.20f',num)
ans =
2.71828182845904550000
En otras palabras, los dígitos 17 a 20 son todos 0.
Pero las cosas se ponen extrañas cuando paso num
a la variable precision arithmetic function en el Symbolic Toolbox, diciéndole que para representar el número con 21 dígitos de precisión:
>> vpa(num,21)
ans =
2.71828182845904553488
¿QUÉ? ¡Han vuelto a aparecer los últimos 4 dígitos! ¿No deberían haberse perdido cuando el número original que ingresé se almacenó como una variable de precisión doble num
? Dado que num
es una variable de precisión doble cuando se pasa a vpa
, ¿cómo sabe vpa
cuáles fueron?
Mi mejor estimación sobre lo que está sucediendo es que MATLAB representa internamente num
con más precisión que un doble ya que lo inicialicé a un número con más dígitos más allá del punto decimal que una variable de precisión doble podría manejar. ¿Es esto realmente lo que está sucediendo o está sucediendo algo más?
PRIMA: Y aquí es una fuente adicional de confusión si aún no dispone de una migraña de lo anterior ...
>> num = 2.71828182845904553488; %# Declare with 20 digits past the decimal
>> num = 2.718281828459045531; %# Re-declare with 18 digits past the decimal
>> vpa(num,21)
ans =
2.71828182845904553488 %# It's the original 20-digit number!!!
1 de respuesta instructivo una pregunta interesante! – Jonas
Aha! Entonces, casualmente estaba usando la expansión decimal exacta de un valor binario como mi número de prueba. ¡Todo tiene sentido ahora! No estoy seguro de cómo me las arreglé para perder eso, aunque ... tal vez fue debido a la falta de sueño ya que mi hija está saliendo y me mantuvo despierta toda la noche. ;) – gnovice
@Andrew: ¿estás trabajando en MathWorks? – Mikhail