2011-02-09 23 views
5

Tangencialmente relacionada con la pregunta this, ¿qué está pasando exactamente aquí con el formato del número?Formatos de números internos de Mathematica y precisión

In[1] := InputForm @ 3.12987*10^-270 
Out[1] := 3.12987`*^-270 

In[2] := InputForm @ 3.12987*10^-271 
Out[2] := 3.1298700000000003`*^-271 

Si utiliza *10.^ como el multiplicador de la transición es donde se ingenuidad esperar que sea:

In[3] := InputForm @ 3.12987*10.^-16 
Out[3] := 3.12987`*^-16 

In[4] := InputForm @ 3.12987*10.^-17 
Out[4] := 3.1298700000000004`*^-17 

mientras que *^ toma la transición un poco más, aunque es la precisión de la máquina que se inicia descamación cabo:

In[5] := InputForm @ 3.12987*^-308 
Out[5] := 3.12987`*^-308 

In[6] := InputForm @ 3.12987*10.^-309 
Out[6] := 3.12987`15.954589770191008*^-309 

inicia la base de la ruptura sólo mucho más tarde

In[7] := InputForm @ 3.12987*^-595 
Out[7] := 3.12987`15.954589770191005*^-595 

In[8] := InputForm @ 3.12987*^-596 
Out[8] := 3.1298699999999999999999999999999999999999`15.954589770191005*^-596 

Supongo que estas transiciones se relacionan con el formato en el que Mathematica mantiene internamente sus números, pero ¿alguien sabe, o se preocupa de arriesgarse adivinando cómo?

Respuesta

8

Si entiendo correctamente, se está preguntando cuándo el InputForm mostrará más de 6 dígitos. Si es así, sucede al azar, cada vez que se requieren más dígitos para representar "mejor" el número obtenido después de la evaluación. Dado que la evaluación implica multiplicación explícita por 10^(algo de potencia), y dado que la entrada decimal no tiene que ser necesariamente (y en este caso no lo es) exactamente representable en binario, puede obtener pequeñas diferencias de lo que espera.

In[26]:= Table[3.12987*10^-j, {j, 10, 25}] // InputForm 

Out[26]//InputForm= 
{3.12987*^-10, 
3.12987*^-11, 
3.12987*^-12, 
3.12987*^-13, 
3.12987*^-14, 
3.12987*^-15, 
3.12987*^-16, 
3.1298700000000004*^-17, 
3.1298700000000002*^-18, 
3.12987*^-19, 
3.12987*^-20, 
3.1298699999999995*^-21, 
3.1298700000000003*^-22, 
3.1298700000000004*^-23, 
3.1298700000000002*^-24, 
3.1298699999999995*^-25} 

En cuanto a la sintaxis *^entrada, que es efectivamente un constructo de análisis (en realidad léxica). No se computa una potencia exacta explícita de 10. Se construye un valor de punto flotante y es lo más fiel posible, en la medida permitida por binario a decimal, a su entrada. InputForm mostrará tantos dígitos como se usaron al ingresar el número, porque ese es de hecho el decimal más cercano al valor binario correspondiente que se creó.

Cuando se superan las limitaciones de los números de coma flotante de la máquina, se obtiene un análogo de precisión arbitrario. Ya no es machinePrecision, pero en realidad es $ MachinePrecision (ese es el análogo de bignum para flotar en Mathematica).

Lo que ves en InputForm para 3.12987 *^- 596 (una terminación decimal con un montón de 9) es, creo, causado por la representación interna de Mathematica que implica el uso de bits de guardia. Si solo hubiera 53 bits de mantisa, análogos a una máquina doble, entonces la representación decimal más cercana sería la de los seis dígitos esperados.

Daniel Lichtblau Wolfram Research

+0

1 para el uso de 'haphazardly' mientras que describe el comportamiento del software. –

+0

Gracias por las ideas. La transición a la precisión arbitraria siempre me ha confundido, especialmente cuando tengo que escribir grandes cantidades de datos en un archivo y de repente ~ 16 caracteres de datos de precisión se agregan a cada número. – Timo

+0

@Timo 16 caracteres parece excesivo. ¿Quiere decir que el número que obtiene es alrededor de 16 bytes más grande que una máquina doble? ¿O que observas ese fenómeno de bit de guardia? Si los números en cuestión están de hecho dentro del rango de tamaño de los dobles de la máquina, siéntete libre de publicar o enviarme un ejemplo, ya que puede indicar un problema en tu código o en Put o Export de Mathematica, lo que sea que estés usando. –

Cuestiones relacionadas