2012-05-09 19 views
20

El manual de un programa escrito en Fortran 90 dice: "Todas las variables y parámetros reales se especifican en precisión de 64 bits (es decir, real*8)".¿Qué significa "real * 8"?

De acuerdo con Wikipedia, la precisión simple corresponde a la precisión de 32 bits, mientras que la precisión doble corresponde a la precisión de 64 bits, por lo que aparentemente el programa usa precisión doble.

¿Pero qué significa real*8?

Pensé que el 8 significaba que 8 dígitos seguían el punto decimal. Sin embargo, Wikipedia parece decir que la precisión única generalmente proporciona 6-9 dígitos, mientras que double precision generalmente proporciona 15-17 dígitos. ¿Esto significa que la declaración "precisión de 64 bits" es inconsistente con real*8?

Respuesta

28

El 8 se refiere al número de bytes que utiliza el tipo de datos.

Por lo tanto, un entero de 32 bits es integer*4 en la misma línea.

Una búsqueda rápida encontró this guide to Fortran data types, que incluye:

El "real * 4" sentencia especifica los nombres de las variables a ser números reales de precisión simple de 4 bytes que tiene 7 dígitos de precisión y un rango de magnitud de 10 de -38 a +38. La declaración "real" es la misma que la declaración "real * 4" en casi todas las computadoras de 32 bits.

y

El "real * 8" sentencia especifica los nombres de las variables a ser el doble de precisión números reales de 8 bytes que tiene 15 dígitos de precisión y un rango de magnitud de 10 de -308 a + 308. La declaración de "doble precisión" es la misma que la declaración "real * 8" en casi todas las computadoras de 32 bits.

+9

-1 para Jon Skeet respondiendo una pregunta de Fortran citando una referencia arcaica y engañosa. Las otras respuestas a esta pregunta demuestran una mejor comprensión del Fortran moderno. –

+5

@HighPerformanceMark: ¿Quizás podría darme un enlace más útil para que yo cambie? Ciertamente, no voy a decir que estoy siquiera un poco informado sobre Fortran, pero ¿el núcleo de la respuesta (que el 8 representa el número de bytes) es realmente incorrecto o engañoso? –

10

La notación estrella (como TYPE*n se llama) es una construcción de Fortran no estándar si se utiliza con TYPE distinto CHARACTER.

Si se aplica al tipo de carácter, crea una matriz de n caracteres (o una cadena de n caracteres).

Si se aplica a otro tipo, especifica el tamaño de almacenamiento en bytes. Esto debe evitarse a toda costa en Fortran 90+, donde se introduce el concepto de tipo KIND. Especificar el tamaño de almacenamiento crea aplicaciones no portátiles.

21

Ahora hay al menos 4 formas de especificar la precisión en Fortran.

Como ya se ha respondido, real*8 especifica el número de bytes. Es algo obsoleto, pero debería ser seguro.

La nueva forma es con "tipos". Uno debe usar las funciones intrínsecas para obtener el tipo que tenga la precisión que necesita. Especificar el tipo por valor numérico específico es arriesgado porque los diferentes compiladores usan valores diferentes.

Otra forma es utilizar los tipos con nombre de la ISO_C_Binding.This question analiza el sistema tipo para enteros, es muy similar para los reales.

+5

ACTUALIZACIÓN: la extensión Fortran 2008 del módulo de entorno ISO ahora es más comúnmente compatible. Entonces, si 'utiliza ISO_FORTRAN_ENV', tendrá acceso a valores amables que especifican tipos reales y enteros por número de bits (por ejemplo,' real (real32) :: 'y' real (real64) :: ') como estándar y portátil forma de especificar tipos por tamaño de almacenamiento. –