Estoy tratando de aprender Fortran y estoy viendo un montón de diferentes definiciones que se pasa alrededor y me pregunto si están tratando de lograr la misma cosa. ¿Cuál es la diferencia entre los siguientes?

  • integer*4
  • integer(4)
  • integer(kind=4)
InformationsquelleAutor Sam | 2010-07-03

3 Comentarios

  1. 51

    En Fortran >=90, el mejor enfoque es utilizar funciones intrínsecas para especificar la precisión que usted necesita — esto garantiza la portabilidad y que usted reciba la precisión que usted necesita. Por ejemplo, para obtener números enteros i y my_int que apoyará al menos 8 dígitos decimales, puedes usar:

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

    De haber definido RegInt_K (o cualquier nombre que usted seleccione) como un parameter, usted puede utilizar a lo largo de su código como un símbolo. Esto también hace que sea fácil cambiar la precisión.

    Solicitando 8 o 9 dígitos decimales se suele obtener un entero de 4 bytes.

    integer*4 es una extensión común de volver a los viejos FORTRAN para especificar un número entero de 4 bytes. Aunque, esta sintaxis no es y nunca fue Fortran estándar.

    integer (4) o integer (RegInt_K) se corta para integer (kind=4) o integer (kind=RegInt_K). integer (4) no es lo mismo que integer*4 y no es portátil — la lengua estándar no especifica los valores numéricos de los tipos. La mayoría de los compiladores utilizan el kind=4 para enteros de 4 bytes-de estos compiladores integer*4 y integer(4) va a proporcionar el mismo tipo integer — pero hay excepciones, así integer(4) no es portable y lo mejor es evitarlo.

    El enfoque de reales es similar.

    ACTUALIZACIÓN: si usted no desea especificar tipos numéricos por la precisión requerida, sino por el almacenamiento que se va a utilizar, Fortran 2008 proporciona un método. reales y enteros puede ser especificado por el número de bits de almacenamiento después de useción de la ISO_FORTRAN_ENV módulo, por ejemplo, para una de 4 bytes (32 bits) integer:

    use ISO_FORTRAN_ENV
    integer (int32) :: MyInt
    

    La gfortran manual tiene la documentación en «intrínseca de los módulos».

    • que fue una fabulosa explicación! impresionante! excelente! es de cristal claro para mí ahora.. 😀 muchas gracias!
  2. 23

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

    Muchos compiladores de elegir esta numeración:

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

    Pero se puede elegir cualquier otro de 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 (al menos en el grupo de los 77 y NAG), que elige este método. 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 4 bytes o un entero de 8 bytes entero dependiendo del compilador.

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

    Para ver las opciones de cómo configurar el tipo de números véase M. S. B. la respuesta.

    El mismo concepto vale para real tipos de datos. Ver Fortran 90 tipo de parámetro (el mataap la respuesta).

    • Lo interesante aquí, es que las formas type(tipo) y tipo*tipo no son completamente intercambiables y que requiere atención. Por ejemplo, en Intel Fortran entero(6) y integer*4 son el mismo, pero: COMPLEJO([TIPO=]4) es el mismo COMPLEJO*8, COMPLEJO([TIPO=]8) o COMPLEJOS*16, COMPLEJO([TIPO=]16) o COMPLEJOS*32
    • Yo no la dirección real y complejo, en esta respuesta, porque no es una cuestión separada acerca de ellos. Me dirigí entero de sólo aquí. Vea el enlace en la y de la respuesta. El hecho de que real y compleja de la misma precisión tendrá el mismo número, se ve obligado por la norma.
  3. 1

    Voy a hacer referencia a este esclarecedor artículo, escribió recientemente por @SteveLionel, y trate de cubrir algunos de los detalles que no están presentes en las otras respuestas hasta ahora:


    1. La sintaxis que se muestra en integer*n o real*n fue una extensión común proporcionada por los compiladores de mucho tiempo atrás, cuando las diferentes arquitecturas de computadoras comenzó a tener diferentes diseños en el formato de la memoria de valores integer y real, donde n fue el tamaño en bytes del valor almacenado. Sin embargo, que no dijo nada sobre el rango o la precisión de los valores: las diferentes implementaciones de un entero de 16 bits, por ejemplo, podría proporcionar diferentes rangos y valores límite.

    Registro tamaños pueden ser 8, 12, 16, 30, 32, 36, 48, 60 o de 64 bits, algunos de los CDC de las máquinas-de complementar enteros (permitiendo a menos cero para un valor entero!), el PDP-11 línea había varios de punto flotante diferentes formatos dependiendo de la serie, el IBM 360/370 había «hex normalización» de su punto flotante, etc […] Tan populares fueron estas extensiones que muchos programadores de pensamiento (y aún hoy en día muchos piensan) que esta sintaxis es estándar Fortran; no es!


    1. Cuando Fortran 90 salió, kind parámetros se han añadido a la lengua, junto con intrínseco funciones de investigación (especialmente kind, selected_int_kind y selected_real_kind, pero también otros, como precision, digits, epsilon…) para ayudar al programador especificar una serie de requisitos mínimos para precisión y rango de tipos numéricos (todavía no oficial mención al modelo de almacenamiento o bytes). La sintaxis es integer(kind=n) o incluso integer(n), donde n es un valor constante correspondiente a un tipo de entero apoyado por el compilador. Para las constantes literales, la sintaxis es 12_n o 3.4e-2_n.

      La ventaja de esta solución fue que Fortran no (y todavía no) hacer suposiciones acerca de los detalles de la implementación de tipos de datos distintos de los resultados de la investigación de las funciones se utilizan para seleccionar el tipo, por lo que el código es parametrizada por el problema resuelto, no por el idioma o el hardware. El gotcha es, como se ha dicho en otras respuestas, cada compilador puede elegir su tipo de números, suponiendo un número mágico como integer(4) no es portable.


    1. También con Fortran 90 vino el concepto de defecto tipos, que es lo que usted consigue cuando usted no especifica un tipo.

    El defecto tipo fueron dependientes de la implementación, sin embargo a través de un compilador Fortran 2008 se requiere para soportar sólo un tipo entero y dos reales de clase. (Que sigue siendo cierto en Fortran 2018, pero hay un requisito adicional de que al menos un entero de tipo de soporte de 18 dígitos decimales.) Si usted escribe una constante literal sin un especificador de tipo, tienes el tipo predeterminado.


    1. Con Fortran 2003 y la inclusión de la intrínseca módulo ieee_arithmetic, usted puede buscar y seleccionar un tipo real con el estándar IEEE de punto flotante de capacidades, si está disponible.

    Hay arquitecturas donde tanto el IEEE y el no-flotante de IEEE tipos están disponibles, tales como HP (anteriormente Compaq anteriormente DEC) Alfa. En este caso se puede usar IEEE_SELECTED_REAL_KIND intrínsecas módulo IEEE_ARITHMETIC para obtener un flotante de IEEE tipo. Y ¿qué pasa si no se admite ningún tipo que cumple con los requisitos? En ese caso los elementos intrínsecos de retorno de un número negativo que (por lo general, dependiendo del contexto) de activación de un error en tiempo de compilación.


    1. Finalmente, Fortran 2003 presentó la iso_fortran_env intrínseca módulo, que tenía funciones de conocer los tamaño de almacenamiento de los tipos implementado por un compilador, con las características intrínsecas como numeric_storage_size y bit_size. Otra adición de Fortran 2003 revisión fue la iso_c_binding intrínseca módulo, que brindaba valores de los parámetros para garantizar la compatibilidad con los tipos de C, en el almacenamiento, precisión y rango.

    Intrínseca módulo ISO_C_BINDING declara constantes para Fortran tipos que son interoperables con tipos de C, por ejemplo C_FLOAT y C_INT. Utilice estos si estás declarar variables y las interfaces de interoperabilidad con C.


    1. Como nota final, voy a mencionar la reciente Fortran Estándar de 2008, que se extendía intrínseca módulo iso_fortran_env incluir constantes con nombre int8, int16, int32m int64, real32, real64 y real128, cuyos valores corresponden a los tipos de enteros y reales de la clase que ocupa el número especificado de bits. El gotcha es que los constantes sólo asegurar que el tamaño de almacenamiento, no de precisión o alcance. Sólo los uso cuando esto es exactamente lo que usted desea.

    En mi opinión, este es un poco mejor que el antiguo *n de la extensión en la que dice que un tipo se ajusta en que muchos de los bits, pero nada más. Como un ejemplo, hay un compilador donde REAL128 se almacena en 128 bits, pero es realmente el 80 bits «precisión extendida de» real utilizado en el antiguo x86 de punto flotante de la pila de registros. Si el uso de estos, usted podría pensar que usted está usando un portátil, pero realmente no está y puede ser mordido cuando el tipo que se obtiene no tiene las capacidades que usted necesita.

Dejar respuesta

Please enter your comment!
Please enter your name here