2010-07-03 11 views
41

Estoy tratando de aprender Fortran y estoy viendo muchas definiciones diferentes que se están pasando y me pregunto si están intentando para lograr lo mismo. ¿Cuál es la diferencia entre lo siguiente?Fortran: entero * 4 vs entero (4) vs entero (tipo = 4)

  • integer*4
  • integer(4)
  • integer(kind=4)

Respuesta

42

En Fortran> = 90, el mejor enfoque es utilizar las funciones intrínsecas para especificar la precisión que necesita - esto garantiza tanto la portabilidad y la que se obtiene la precisión que necesitas Por ejemplo, para obtener números enteros i y my_int que soportará al menos 8 dígitos decimales, se puede utilizar:

integer, parameter :: RegInt_K = selected_int_kind (8) 
integer (kind=RegInt_K) :: i, my_int 

Habiendo definido "RegInt_K" (o el nombre que elija) como un parámetro, se puede usar a lo largo tu código como un símbolo Esto también hace que sea fácil cambiar la precisión.

Solicitar 8 o 9 dígitos decimales normalmente obtendrá un entero de 4 bytes.

entero * 4 es una extensión común que se remonta al antiguo FORTRAN para especificar un entero de 4 bytes.

entero (4) o entero (RegInt_K) son abreviaturas para entero (tipo = 4) o entero (tipo = RegInt_K). integer (4) no es lo mismo que integer * 4 y no es portátil; el estándar de idioma no especifica los valores numéricos de los tipos. La mayoría de los compiladores usan el tipo = 4 para enteros de 4 bytes; para estos compiladores, el entero * 4 y el entero (4) proporcionarán el mismo tipo de entero; pero hay excepciones, por lo que el entero (4) no es portátil y es mejor evitarlo .

El enfoque para los reales es similar.

ACTUALIZACIÓN: si no desea especificar los tipos numéricos con la precisión requerida, sino el almacenamiento que usarán, Fortran 2008 proporciona un método. reales y números enteros pueden ser especificados por el número de bits de almacenamiento después de use ing el módulo ISO_FORTRAN_ENV, por ejemplo, para un entero de 4 bytes (32 bits):

use ISO_FORTRAN_ENV 
integer (int32) :: MyInt 

El manual gfortran tiene documentación bajo "intrínseca módulos ".

+0

¡esa fue una explicación fabulosa! ¡maravilloso! ¡excelente! ahora lo tengo muy claro ...: D muchas gracias! – Sam

19

Solo una explicación más explícita de lo que es el tipo. El compilador tiene una tabla de diferentes tipos numéricos. Todos los tipos enteros son diferentes tipos del tipo básico - integer. Digamos que el compilador tiene tipos de 1 byte, 2 bytes, 4 bytes, 8 bytes y 16 bytes integer (o real). En la tabla, el compilador tiene un índice para cada uno de este tipo; este índice es el número de tipo.

Muchos compiladores eligen esta numeración:

kind number number of bytes 
1    1 
2    2 
4    4 
8    8 
16    16 

Pero pueden elegir cualquier otra numeración. Una de las posibilidades obvias es

kind number number of bytes 
1    1 
2    2 
3    4 
4    8 
5    16 

De hecho, existen compiladores (por lo menos 77 y NAG), que optan por este enfoque. También hay opciones para cambiar esto.Por lo tanto, kind números no son portátiles integer(kind=4) o integer(4) significa un entero de 4 bytes o un entero de 8 bytes según el compilador.

integer*4 es portátil en el sentido de que siempre significa 4 bytes. Pero, por otro lado, no es portátil porque nunca ha sido parte de ningún estándar. Los programas que usan esta notación no son válidos Fortran 77, 90 o cualquier otro Fortran.

Para ver las opciones correctas de cómo configurar los números de tipo, ver la respuesta de M.S.B.

El mismo concepto se cumple para real tipos de datos. Ver Fortran 90 kind parameter (la respuesta de mataap).

+1

Lo interesante aquí es que las formas tipo (tipo) y tipo * no son totalmente intercambiables y requieren atención. Por ejemplo, en Intel Fortran entero (6) y entero * 4 son iguales, pero: COMPLEJO ([KIND =] 4) es lo mismo que COMPLEJO * 8, COMPLEJO ([CLASE =] 8) o COMPLEJO * 16 , COMPLEJO ([KIND =] 16) o COMPLEJO * 32 – syscreat

+0

@syscreat No aborde real y complejo en esta respuesta, porque hay una pregunta por separado sobre ellos. Me dirigí solo a un entero aquí. Ver el enlace en el y de la respuesta. El estándar exige forzar el hecho de que el mismo estándar tenga real y complejo con la misma precisión. –