APÉNDICE 5 Funciones intrínsecas en Fortran 90 Existe una gran cantidad de funciones intrínsecas y cinco subrutinas intrínsecas en Fortran 90. Trato las rutinas numéricas y matemáticas muy pronto, ya que no se cambian de Fortran 77 y por lo tanto deben ser bien conocidas. Esta sección se basa en la sección 13 de la norma ISO (1991), que contiene un tratamiento más formal. Seguimos la disposición de las diferentes funciones y subrutinas en el estándar, pero explicamos directamente en la lista. Para un tratamiento más detallado, nos referimos a Metcalf y Reid (1990, 1993). Cuando un parámetro a continuación es opcional, se da en caracteres minúsculos. Cuando una lista de argumentos contiene varios argumentos, la función puede ser llamada por argumentos relacionados con la posición o por una palabra clave. Se debe usar una palabra clave si no se incluye algún argumento anterior. Las palabras clave son normalmente los nombres que se dan a continuación. No siempre hemos dado todas las limitaciones naturales a las variables, por ejemplo, que no se permite que el rango sea negativo. La función PRESENT (A) devuelve. TRUE. Si el argumento A está en la lista de llamadas,.FALSE. En el otro caso. El uso se ilustra en el programa de ejemplo en el capítulo 8 del texto principal. Los siguientes están disponibles en Fortran 77: ABS, AIMAG, AINT, ANINT, CMPLX, CONJG, DBLE, DIM, DPROD, INT, MAX, MIN, MOD, NINT, REAL y SIGN. Además, CEILING, FLOOR y MODULO se han añadido a Fortran 90. Sólo el último es difícil de explicar, lo que es más fácil de hacer con los ejemplos de ISO (1991) Las siguientes funciones de Fortran 77 puede utilizar un tipo-parámetro como En AINT (A, tipo). AINT, ANINT, CMPLX, INT, NINT y REAL. Un hecho histórico es que las funciones numéricas en Fortran 66 tenían que tener nombres específicos (diferentes) en diferentes precisiones, y estos nombres explícitos son los únicos que se pueden usar cuando se pasa un nombre de función como argumento. Siguen una tabla completa de todas las funciones numéricas. Los nombres que se indican con una estrella no están permitidos para ser utilizados como argumentos. Algunas funciones, como INT e IFIX tienen dos nombres específicos, o se puede utilizar. Por otro lado, algunas funciones no tienen ningún nombre específico. A continuación, utilizo C para valores de coma flotante complejos, D para valores de coma flotante en doble precisión, I para enteros y R para valores de coma flotante en una sola precisión. El truncamiento es hacia cero, INT (-3.7) se convierte en -3. Pero el redondeo es correcto, NINT (-3.7) se convierte en -4. Las nuevas funciones PISO y TECHO truncan hacia menos y más infinito, respectivamente. La función CMPLX puede tener uno o dos argumentos, si dos argumentos están presentes éstos deben ser del mismo tipo pero no COMPLEX. La función MOD (X, Y) calcula X - INT (X / Y) Y. La función de transferencia de signo SIGN (X, Y) toma el signo del segundo argumento y lo coloca en el primer argumento, ABS (X) si Y gt 0 y - ABS (X) si Y lt 0. Diferencia positiva DIM es una función que nunca he utilizado, pero DIM (X, Y) da X-Y si esto es positivo y cero en el otro caso. El producto interno DPROD por otra parte es una función muy útil que da el producto de dos números en sola precisión como número de doble precisión. Es rápido y preciso. Las dos funciones MAX y MIN son únicas en que pueden tener un número arbitrario de argumentos, pero al menos dos. Los argumentos tienen que ser del mismo tipo, pero no se permite que sean del tipo COMPLEX. Igual que en Fortran 77. Todas las funciones trigonométricas funcionan en radianes. Los siguientes están disponibles: ACOS, ASIN, ATAN, ATAN2, COS, COSH, EXP, LOG, LOG10, SIN, SINH, SQRT, TAN y TANH. Un hecho histórico es que las funciones matemáticas en Fortran 66 tenían que tener nombres específicos (diferentes) en diferentes precisiones, y estos nombres explícitos son los únicos que se pueden usar cuando se pasa un nombre de función como argumento. Una tabla completa de todas las funciones matemáticas sigue. A continuación, utilizo C para valores de coma flotante complejos, D para valores de coma flotante en doble precisión, I para enteros y R para valores de coma flotante en una sola precisión. El propósito de la mayoría de estas funciones es obvio. Tenga en cuenta que todos ellos sólo se definen para números de coma flotante y no para enteros. Por lo tanto, no puede calcular la raíz cuadrada de 4 como SQRT (4). Pero en su lugar puede utilizar NINT (SQRT (REAL (4))). Observe también que todas las funciones complejas devuelven el valor principal. La raíz cuadrada da un resultado real para un argumento real en precisión simple o doble, y un resultado complejo para un argumento complejo. Así SQRT (-1.0) da un mensaje de error (normalmente ya en tiempo de compilación), mientras que puede obtener la raíz cuadrada compleja utilizando las siguientes instrucciones. El argumento para los logaritmos habituales tiene que ser positivo, mientras que el argumento para CLOG debe ser diferente de cero. El módulo para el argumento a ASIN y ACOS tiene que ser como máximo 1. El resultado estará dentro de - pi / 2, pi / 2 y 0, pi, respectivamente. La función ATAN devolverá un valor en - pi / 2, pi / 2. La función ATAN2 (Y, X) arctan (y, x) devolverá un valor en (-pi, pi Si Y es positivo el resultado será positivo Si Y es cero el resultado será cero si X es positivo y Pi si X es negativo Si Y es negativo el resultado será negativo Si X es cero, el resultado será más o menos pi / 2. No se permite que tanto X como Y sean simultáneamente cero. Evitar la división por cero. Una limitación natural de las funciones matemáticas es la precisión limitada y rango, lo que significa que por ejemplo EXP puede causar subflujo o desbordamiento en valores bastante comunes del argumento. Las funciones trigonométricas obtendrá una precisión muy baja para los argumentos grandes. Estas limitaciones dependen de la implementación y se deben dar en el manual del proveedor. Las funciones a continuación realizan operaciones desde y hacia cadenas de caracteres. Tenga en cuenta que ACHAR funciona con el conjunto de caracteres ASCII estándar mientras CHAR funciona con la representación en el equipo que está utilizando. Las rutinas anteriores comparan dos cadenas usando clasificación según ASCII. Si una cadena es más corta que la otra, se añaden espacios en blanco al final de la cadena corta. Si una cadena contiene un carácter fuera del conjunto de caracteres ASCII, el resultado depende de la implementación. LEN (STRING) devuelve la longitud de una cadena de caracteres. No se debe asignar un valor a la variable STRING. La primera devuelve el tipo de argumento real, que puede ser del tipo INTEGER, REAL, COMPLEX, LOGICAL o CHARACTER. El argumento X no tiene que ser asignado ningún valor. El segundo devuelve un tipo entero con el número solicitado de dígitos y el tercero devuelve el tipo para números de punto flotante con precisión numérica al menos P dígitos y un exponente decimal entre - R y R. Los parámetros P y R deben ser enteros escalares. Debe darse al menos uno de P y R. El resultado de SELECTEDINTKIND es un entero desde cero y hacia arriba, si el tipo deseado no está disponible obtendrá -1. Si varios tipos implementados satisfacen la condición, se utiliza el que tiene el rango menos decimal. Si todavía hay varios tipos o clases que satisfacen la condición, se usará el que tenga el número de tipo más pequeño. El resultado de SELECTEDREALKIND es también un entero desde cero y hacia arriba si el tipo deseado no está disponible, entonces se devuelve -1 si la precisión no está disponible, -2 si el rango de exponentes no está disponible y -3 si ninguno de los requisitos están disponibles. Si varios tipos implementados satisfacen la condición, se devuelve el que tiene la menor precisión decimal, y si hay varios de ellos, se devuelve el que tiene el menor número de tipo. Los ejemplos se dan en el capítulo 2 del texto principal. Ejemplos de clases en algunas implementaciones diferentes (NAG y Cray) se dan en el Apéndice 6. LOGICAL (L, kind) convierte entre diferentes tipos de variables lógicas. Las variables lógicas se pueden implementar de varias maneras, por ejemplo con una representación física que ocupa un bit (no recomendado), un byte, una palabra o incluso una palabra doble. Esta diferencia es importante si COMMON y EQUIVALENCE con variables lógicas han sido mal utilizados en un programa de la manera tradicional de la programación del Fortran 66. 8. Funciones de indagación numérica: Estas funciones funcionan con un cierto modelo de aritmética de números enteros y flotantes, ver ISO (1991), sección 13.7.1. Las funciones devuelven propiedades de números del mismo tipo que la variable X. Que puede ser real y en algunos casos entero. Las funciones que devuelven propiedades del argumento real X están disponibles en la sección 12 a continuación, funciones de manipulación de coma flotante. BITSIZE (I) devuelve el número de bits según el modelo de representación de bits en la norma ISO (1991), sección 13.5.7. Normalmente obtenemos el número de bits en una palabra (completa). Se utiliza el modelo de representación de bits en la norma ISO (1991), sección 13.5.7. TRANSFER (SOURCE, MOLD, size) especifica que la representación física del primer argumento SOURCE se tratará como si tuviera tipo y parámetros como el segundo argumento MOLD. Pero sin convertirlo. El propósito es dar la posibilidad de mover una cantidad de un cierto tipo a través de una rutina que no tiene exactamente ese tipo de datos. 12. Funciones de manipulación de punto flotante: Estas funciones funcionan en un cierto modelo de aritmética de números enteros y de coma flotante, véase la norma ISO (1991), sección 13.7.1. Las funciones devuelven números relacionados con la variable real X del tipo REAL. Las funciones que devuelven propiedades para los números del mismo tipo que la variable X están en la sección 8 (Funciones de indagación numérica). DOTPRODUCT (VECTORA, VECTORB) hace un producto escalar de dos vectores, que deben tener la misma longitud (el mismo número de elementos). Tenga en cuenta que si VECTORA es del tipo COMPLEX el resultado es SUM (CONJG (VECTORA) VECTORB). MATMIX (MATRIXA, MATRIXB) hace que el producto de la matriz de dos matrices, que debe ser coherente, es decir, tienen las dimensiones como (M, K) y (K, N). Se utiliza en el capítulo 11 del texto principal. 14. Funciones de matriz: ALL (MASK, dim) devuelve un valor lógico que indica si todas las relaciones en MASK son. TRUE. . A lo largo de sólo la dimensión deseada si se da el segundo argumento. ANY (MASK, dim) devuelve un valor lógico que indica si cualquier relación en MASK es. TRUE. . A lo largo de sólo la dimensión deseada si se da el segundo argumento. COUNT (MASK, dim) devuelve un valor numérico que es el número de relaciones en MASK que son. TRUE. . A lo largo de sólo la dimensión deseada si se da el segundo argumento. MAXVAL (ARRAY, dim, mask) devuelve el valor más grande en la matriz ARRAY. De aquellos que obedecen a la relación en el tercer argumento MASK si se le da, sólo a lo largo de la dimensión deseada si se da el segundo argumento DIM. MINVAL (ARRAY, dim, mask) devuelve el valor más pequeño en la matriz ARRAY. De aquellos que obedecen a la relación en el tercer argumento MASK si se le da, sólo a lo largo de la dimensión deseada si se da el segundo argumento DIM. PRODUCT (ARRAY, dim, mask) devuelve el producto de todos los elementos de la matriz ARRAY. De aquellos que obedecen a la relación en el tercer argumento MASK si se le da, sólo a lo largo de la dimensión deseada si se da el segundo argumento DIM. SUM (ARRAY, dim, mask) devuelve la suma de todos los elementos de la matriz ARRAY. De aquellos que obedecen a la relación en el tercer argumento MASK si se le da, sólo a lo largo de la dimensión deseada si se da el segundo argumento DIM. Un ejemplo se da en el apéndice 3, sección 10. ALLOCATED (ARRAY) es una función lógica que indica si la matriz está asignada. LBOUND (ARRAY, dim) es una función que devuelve el límite de dimensión inferior para el ARRAY. Si DIM (la dimensión) no se da como argumento, se obtiene un vector entero, si se incluye DIM, se obtiene el valor entero con exactamente ese límite de dimensión inferior, para el que se preguntó. SHAPE (SOURCE) es una función que devuelve la forma de una matriz SOURCE como un vector entero. SIZE (ARRAY, dim) es una función que devuelve el número de elementos en una matriz ARRAY. Si DIM no se da, y el número de elementos en la dimensión relevante si se incluye DIM. UBOUND (ARRAY, dim) es una función similar a LBOUND que devuelve los límites dimensionales superiores. MERGE (TSOURCE, FSOURCE, MASK) es una función que une dos matrices. Da los elementos en TSOURCE si la condición en MASK es. TRUE. Y FSOURCE si la condición en MASK es. FALSE. Los dos campos TSOURCE y FSOURCE tienen que ser del mismo tipo y de la misma forma. El resultado es también de este tipo y esta forma. También MASK debe tener la misma forma. He aquí un ejemplo bastante completo del uso de MERGE que también usa RESHAPE de la siguiente sección para construir matrices de prueba adecuadas. Observe que las dos subrutinas WRITEARRAY y WRITELARRAY son rutinas de prueba para escribir matrices que en el primer caso son de tipo REAL, en el segundo caso de un tipo LÓGICO. Se obtiene la salida siguiente PACK (ARRAY, MASK, vector) empaqueta una matriz a un vector con el control de MASK. La forma de la matriz lógica MASK tiene que coincidir con la de ARRAY o MASK debe ser un escalar. Si se incluye VECTOR, tiene que ser una matriz de rango 1 (es decir, un vector) con al menos tantos elementos como los que son verdaderos en MASK y tienen el mismo tipo que ARRAY. Si MASK es un escalar con el valor. TRUE. Entonces VECTOR debe tener el mismo número de elementos que ARRAY. El resultado es un vector con tantos elementos como los de ARRAY que obedecen las condiciones si VECTOR no está incluido (es decir, todos los elementos si MASK es un escalar con valor. TRUE). En el otro caso el número de elementos del resultado será tanto como en VECTOR. Los valores serán los aprobados, es decir los valores que cumplan la condición, y estarán en el orden Fortran ordinario. Si VECTOR está incluido y el número de sus elementos excede el número de valores aprobados, los valores faltantes requeridos para el resultado se toman de las ubicaciones correspondientes en VECTOR. El siguiente ejemplo se basa en la modificación de la de MERGE. Pero ahora sólo les doy los resultados. SPREAD (SOURCE, DIM, NCOPIES) devuelve una matriz del mismo tipo que el argumento SOURCE con el rango incrementado en uno. Los parámetros DIM y NCOPIES son enteros. Si NCOPIES es negativo, se utiliza el valor cero. Si SOURCE es un escalar, entonces SPREAD se convierte en un vector con elementos NCOPIES que tienen el mismo valor que SOURCE. El parámetro DIM indica qué índice debe extenderse. Tiene que estar dentro del rango 1 y 1 (rango de FUENTE). Si SOURCE es un escalar entonces DIM tiene que ser uno. El parámetro NCOPIES es el número de elementos en las nuevas dimensiones. En la solución al ejercicio (11.1) se da una discusión adicional. UNPACK (VECTOR, MASK, ARRAY) dispersa un vector a un array bajo el control de MASK. La forma de la matriz lógica MASK tiene que estar de acuerdo con la de ARRAY. El array VECTOR tiene que tener el rango 1 (es decir, es un vector) con al menos tantos elementos como los que son verdaderos en MASK. Y también tiene que tener el mismo tipo que ARRAY. Si ARRAY se da como un escalar, entonces se considera que es una matriz con la misma forma que MASK y los mismos elementos escalares en todas partes. El resultado será una matriz con la misma forma que MASK y el mismo tipo que VECTOR. Los valores serán los de VECTOR que se aceptan (es decir, los que cumplen la condición en MASK), tomados en el orden Fortran ordinario, mientras que en las posiciones restantes en ARRAY se mantienen los valores antiguos. RESHAPE (SOURCE, SHAPE, pad, order) construye una matriz con una forma SHAPE especificada a partir de los elementos de una matriz determinada SOURCE. Si no se incluye PAD, el tamaño de SOURCE debe ser como mínimo PRODUCT (SHAPE). Si se incluye PAD tiene que tener el mismo tipo que SOURCE. Si se incluye ORDER, tiene que ser una matriz INTEGER con la misma forma que SHAPE y los valores deben ser una permutación de (1,2,3, N), donde N es el número de elementos en SHAPE. Tiene que ser menor que, o igual a 7. El resultado tiene, por supuesto, una forma SHAPE y los elementos son los de FUENTE. Posiblemente complementado con PAD. Las diferentes dimensiones se han permutado en la asignación de los elementos si se incluyó ORDER, pero sin influir en la forma del resultado. Algunos ejemplos simples se dan en la sección anterior y la siguiente y también en la sección 9 del Apéndice 3. Un ejemplo más complicado, que ilustra también los argumentos opcionales, sigue. La salida del programa anterior es la siguiente. Las funciones de cambio devuelven la forma de una matriz sin cambios, pero mueven los elementos. Son bastante difíciles de explicar así que recomiendo estudiar también la norma ISO (1991). CSHIFT (ARRAY, SHIFT, dim) realiza el desplazamiento circular por posiciones SHIFT a la izquierda si SHIFT es positivo ya la derecha si es negativo. Si ARRAY es un vector el cambio se está haciendo de una manera natural, si es un arreglo de una fila más alta entonces el cambio está en todas las secciones a lo largo de la dimensión DIM. Si DIM falta, se considera 1, en otros casos tiene que ser un número entero escalar entre 1 y n (donde n es igual al rango de ARRAY). El argumento SHIFT es un entero escalar o un arreglo entero de rango n-1 y la misma forma que el ARRAY. Excepto a lo largo de la dimensión DIM (que se elimina debido al rango inferior). Diferentes secciones pueden por lo tanto ser desplazadas en varias direcciones y con varios números de posiciones. EOSHIFT (ARRAY, SHIFT, boundary, dim) realiza el desplazamiento hacia la izquierda si SHIFT es positivo y hacia la derecha si es negativo. En lugar de los elementos desplazados, se toman nuevos elementos de BOUNDARY. Si ARRAY es un vector el cambio se está haciendo de una manera natural, si es una matriz de un rango más alto, el cambio en todas las secciones está a lo largo de la dimensión DIM. Si DIM falta, se considera que es 1, en otros casos tiene que tener un valor entero escalar entre 1 y n (donde n es igual al rango de ARRAY). El argumento SHIFT es un entero escalar si ARRAY tiene rango 1, en el otro caso puede ser un entero escalar o un array entero de rango n-1 y con la misma forma que el array ARRAY excepto a lo largo de la dimensión DIM (que se elimina Debido al rango inferior). El correspondiente se aplica a BOUNDARY que tiene que tener el mismo tipo que el ARRAY. Si falta el parámetro BOUNDARY, tiene la opción de valores cero,.FALSE. O en blanco, dependiendo del tipo de datos. Diferentes secciones se pueden desplazar así en varias direcciones y con varios números de posiciones. Un ejemplo simple de las dos funciones anteriores para el caso vectorial sigue, tanto el programa como la salida. A continuación se muestra un ejemplo simple de las dos funciones anteriores en el caso de la matriz. Aquí he utilizado RESHAPE para crear una matriz adecuada para comenzar a trabajar. El programa no se reproduce aquí, sólo las declaraciones principales. TRANSPOSE (MATRIX) transpone una matriz, que es una matriz de rango 2. Reemplaza las filas y columnas de la matriz. MAXLOC (ARRAY, máscara) devuelve la posición del elemento más grande en la matriz ARRAY. Si MASK se incluye sólo para aquellos que cumplen las condiciones en MASK. El resultado es un vector entero Se utiliza en la solución del ejercicio (11.1). MINLOC (ARRAY, máscara) devuelve la posición del elemento más pequeño en la matriz ARRAY. Si MASK se incluye sólo para aquellos que cumplen las condiciones en MASK. El resultado es un vector entero ASSOCIATED (POINTER, target) es una función lógica que indica si el puntero POINTER está asociado con algún objetivo y si se incluye un TARGET específico indica si está asociado exactamente con ese target. Si tanto POINTER como TARGET son punteros, el resultado es. TRUE. Sólo si ambos están asociados con el mismo destino. Remito al lector al capítulo 12 del texto principal, Pointers. Una subrutina que devuelve la fecha, la hora y la zona horaria. Al menos un argumento tiene que ser dado. DATE debe ser una variable de cadena de caracteres escalar con al menos 8 caracteres y se le asigna el valor CCYYMMDD para el siglo, año, mes y día. Todos se dan numéricamente, con espacios en blanco si el sistema no incluye la fecha. TIME también debe ser una variable de cadena de caracteres escalar con al menos 10 caracteres y se le asigna un valor hhmmss. sss para el tiempo en horas, minutos, segundos y milisegundos. Todos se dan numéricamente con espacios en blanco si el sistema no incluye un reloj. ZONE debe ser una variable de cadena de caracteres escalar con al menos 5 caracteres y se le asigna el valor hhmm para señal, tiempo en horas y minutos para la diferencia de hora local con UTC (que se denominó anteriormente Greenwich Mean Time). Todos se dan numéricamente, con espacios en blanco si el sistema no incluye un reloj. En Suecia tenemos por lo tanto 0100 en invierno y 0200 en verano, en Novosibirsk tenemos 0700. La variable VALUES es en su lugar un vector entero con al menos 8 elementos, que da la forma más fácil de usar los resultados de DATEANDTIME en los cálculos de un programa. Si el sistema no incluye la fecha o la hora en la que obtiene el valor - HUGE (0). Que es el número entero más pequeño en el modelo, como salida. El vector incluirá los siguientes elementos: año, mes, día, diferencia de tiempo en minutos. Horas, minutos, segundos y milisegundos. Subrutina que devuelve la hora del sistema. Al menos un argumento tiene que ser dado. COUNT es un entero escalar que se incrementa en uno para cada ciclo hasta COUNTMAX. Donde comienza una vez más. Si no hay reloj del sistema, entonces se devuelve - HUGE (0). COUNTRATE es un entero escalar que da el número de ciclos por segundo. Si no hay reloj del sistema, se devuelve el valor cero. COUNTMAX es un entero escalar que da el valor máximo que COUNT puede alcanzar. Si no hay reloj del sistema, en su lugar se devuelve cero. Una subrutina que copia la secuencia de bits en la posición FROMPOS y tiene la longitud LEN para apuntar a TO a partir de la posición TOPOS. Los bits restantes no se cambian. Todas las cantidades tienen que ser números enteros y todos, excepto TO, tienen que tener INTENT (IN) mientras que TO debe tener INTENT (INOUT) y ser del mismo tipo que FROM. La misma variable puede ser tanto FROM como TO. Algunas restricciones naturales se aplican a los valores de LEN, FROMPOS y TOPOS y también tiene que considerar el valor de BITSIZE. Se puede generar una secuencia de números pseudo aleatorios a partir de un valor inicial que se almacena como un vector entero. Las subrutinas ofrecen una interfaz portátil hacia una secuencia de números aleatorios dependiente de la implementación. Esta subrutina devuelve en la variable de número de coma flotante HARVEST uno (o varios si HARVEST es un array) números aleatorios entre cero y 1. Esta subrutina restablece o da información sobre el generador de números aleatorios. No se deben presentar argumentos. La variable de salida SIZE debe ser un entero escalar y da el número de enteros (N) que el procesador usa para el valor inicial. La variable de entrada PUT es un vector entero que pone los números de inicio proporcionados por el usuario en el generador de números aleatorios. La variable de salida GET (también un vector entero) lee el valor inicial actual. Ejemplo: Ahora está disponible un ejemplo simple sobre el uso de estas funciones. Categoría: Fortran A continuación se enumeran todas las tareas del código de Rosetta que se han resuelto mediante Fortran. Su ayuda necesaria Si conoce Fortran. Escriba código para algunas de las tareas no implementadas en Fortran. Fortran es el lenguaje de programación más antiguo que todavía está en uso generalizado. El lenguaje ha evolucionado considerablemente desde que fue lanzado por primera vez en 1957. Fortran fue desarrollado originalmente para aplicaciones científicas y de ingeniería, y sigue siendo especialmente adecuado para computación numérica y computación científica. Por convención, las versiones anteriores al Fortran 90 se deletrean con todas las letras mayúsculas (por ejemplo, FORTRAN 66, FORTRAN 77), mientras que comenzando con Fortran 90, se usa la escritura de casos mixta (es decir, Fortran 90, Fortran 95, Fortran 2003 y Fortran 2008). La norma más reciente es Fortran 2008 (ISO / IEC 1539-1: 2010). El siguiente, informalmente conocido como Fortran 2015. está en marcha. FORTRAN 77, siendo bastante viejo, carece de casi todo lo que uno espera de un lenguaje de programación moderno. Utiliza una línea de longitud fija y un formato de línea orientado a columnas que fue motivado por tarjetas perforadas. Debido a su antigüedad, y dado que los compiladores de FORTRAN generalmente daban un rendimiento muy bueno para el código numérico, una gran cantidad de código, especialmente el código científico, fue escrito en FORTRAN. Además, durante bastante tiempo no hubo compilador gratuito de Fortran 90, que también causó que un montón de código FORTRAN 77 se escribiera incluso bastante tiempo después de que el Fortran 90 fuera estandarizado. Debido a la gran cantidad de código escrito en FORTRAN 77 sigue siendo relevante hoy en día. De hecho, todos los compiladores Fortran modernos todavía acepta código FORTRAN 77. Fortran 90 fue una revisión importante del lenguaje. Se introdujo un nuevo formato de código fuente de forma libre, características de lenguaje de programación modernas como módulos, punteros y tipos definidos por el usuario, un sistema de tipo mejorado para tipos incorporados y manejo de array incorporado superior. Los nuevos estándares de Fortran (Fortran 2003 y Fortran 2008) agregaron otras características modernas, como el soporte para la programación orientada a objetos. herencia. polimorfismo. procesamiento en paralelo. Y la interoperabilidad con el lenguaje de programación C. Subcategorías Esta categoría incluye las siguientes 3 subcategorías, de un total de 3. Promedio / Promedio móvil simple Promedios / Promedio móvil simple Le recomendamos que solucione esta tarea de acuerdo con la descripción de la tarea, utilizando cualquier idioma que conozca. Calculando el promedio móvil simple de una serie de números. Crear una función / clase / instancia con estado que toma un punto y devuelve una rutina que toma un número como argumento y devuelve una media móvil simple de sus argumentos hasta ahora. Un promedio móvil simple es un método para calcular un promedio de una corriente de números haciendo sólo el promedio de los últimos 160 P 160 números de la corriente 160, donde 160 P 160 se conoce como el período. Se puede implementar llamando a una rutina de iniciación con 160 P 160 como su argumento, 160 I (P), 160 que debe devolver una rutina que cuando se llama con miembros individuales sucesivos de un flujo de números, calcula la media de (arriba A), los últimos 160 P 160 de ellos, permite llamar a este 160 SMA (). La palabra 160 estado 160 en la descripción de la tarea se refiere a la necesidad de 160 SMA () 160 para recordar cierta información entre las llamadas a ella: 160 El período 160 P 160 Un contenedor ordenado de al menos los últimos 160 P 160 números de cada uno de Sus llamadas individuales. El estado 160 también significa que las llamadas sucesivas a 160 I (), 160 el inicializador, 160 deben devolver rutinas separadas que no 160 comparten el estado guardado para que puedan ser utilizadas en dos flujos independientes de datos. El pseudo-código para una implementación de 160 SMA 160 es: Esta versión utiliza una cola persistente para contener los valores p más recientes. Cada función devuelta desde init-moving-average tiene su estado en un átomo que contiene un valor de cola. Esta implementación utiliza una lista circular para almacenar los números dentro de la ventana al principio de cada indicador de iteración se refiere a la celda de lista que contiene el valor que acaba de salir de la ventana y que se reemplazará con el valor simplemente añadido. Uso de un cierre En la actualidad, este sma no puede ser nogc porque asigna un cierre en el montón. Algún análisis de escape podría eliminar la asignación de montón. Uso de una edición de estructura Esta versión evita la asignación de montón del cierre manteniendo los datos en el marco de pila de la función principal. La misma salida: Para evitar que las aproximaciones de punto flotante sigan acumulándose y creciendo, el código podría realizar una suma periódica en toda la matriz de cola circular. Esta implementación produce dos objetos (de función) compartiendo estado. Es idiomático en E separar la entrada de la salida (leer de la escritura) en lugar de combinarlos en un objeto. La estructura es la misma que la implementación de la Desviación EstándarE. El programa de elixir a continuación genera una función anónima con un período incrustado p, que se utiliza como el período de la media móvil simple. La función run lee la entrada numérica y la pasa a la función anónima recién creada, y luego inspecciona el resultado a STDOUT. La salida se muestra a continuación, con el promedio, seguido por la entrada agrupada, formando la base de cada promedio móvil. Erlang tiene clausuras, pero variables inmutables. Una solución entonces es utilizar procesos y un mensaje simple que pasa la API basada. Los lenguajes de matriz tienen rutinas para calcular los avarages de deslizamiento para una secuencia dada de ítems. Es menos eficiente realizar bucle como en los siguientes comandos. Pide continuamente una entrada I. Que se añade al final de una lista L1. L1 se puede encontrar pulsando 2ND / 1, y la media se puede encontrar en List / OPS Pulse ON para terminar el programa. Función que devuelve una lista que contiene los datos promediados del argumento suministrado Programa que devuelve un valor simple en cada invocación: list es la lista que se promedia: p es el período: 5 devuelve la lista promedio: Ejemplo 2: Utilizando el programa movinav2 , 5) - Inicializando el cálculo del promedio móvil, y definir el período de 5 movinav2 (3, x): x - nuevos datos en la lista (valor 3), y el resultado se almacenará en la variable x, y se muestra movinav2 (4, : X - nuevos datos (valor 4), y el nuevo resultado se almacenará en la variable x, y se mostrará (43) / 2. Descripción de la función movinavg: variable r - es el resultado (la lista de promedios) que se devolverá variable i - es la variable de índice, y apunta al final de la sub-lista de la lista de promediar. Variable z - una variable auxiliar La función utiliza la variable i para determinar qué valores de la lista serán considerados en el siguiente cálculo promedio. En cada iteración, la variable i apunta al último valor de la lista que se utilizará en el cálculo promedio. Así que sólo tenemos que averiguar cuál será el primer valor en la lista. Por lo general, hay que tener en cuenta los elementos p, por lo que el primer elemento será el indexado por (i-p1). Sin embargo, en las primeras iteraciones, el cálculo será normalmente negativo, por lo que la siguiente ecuación evitará los índices negativos: max (i-p1,1) o, ordenando la ecuación, max (i-p, 0) 1. Pero el número de elementos en las primeras iteraciones también será menor, el valor correcto será (índice final - comenzar índice 1) o, ordenando la ecuación, (i - (max (ip, 0) 1), y luego , (I - max (ip, 0)). La variable z tiene el valor común (max (ip), 0) así que el beginindex será (z1) y los numberofelements serán (iz) mid (list, z1, iz) devolverá la lista de valor que será la suma promedio .) Los sumará sum (.) / (Iz) ri los medirá y almacenará el resultado en el lugar apropiado en la lista de resultados Usando un cierre y creando una función
No comments:
Post a Comment