Friday 4 August 2017

Fortran 90 Moving Average


Fortran Jobs A tendência de procura de anúncios de emprego citando Fortran como uma proporção de todos os trabalhos de TI com uma correspondência na categoria de linguagens de programação. Fortran Salary Trend Esta tabela fornece a média móvel de 3 meses para os salários citados em empregos de TI permanentes citando Fortran no Reino Unido. Fortran Salary Histogram Esta tabela fornece um histograma de salário para empregos de TI citando Fortran durante os 3 meses até 15 de dezembro de 2016 no Reino Unido. Fortran Top 19 Locais de trabalho A tabela abaixo analisa a demanda e fornece um guia para os salários médios citados em empregos de TI citando Fortran no Reino Unido durante os 3 meses até 15 de dezembro de 2016. A coluna de mudança de Rank fornece uma indicação da mudança na demanda Dentro de cada local com base no mesmo período de 3 meses do ano passado. Variação de Rank no mesmo período Ano passado Correspondência Permanent IT Job Ads Salário Mediano Last 3 MonthsAPPENDIX 5 Funções intrínsecas no Fortran 90 Há um grande número de funções intrínsecas e cinco subrotinas intrínsecas no Fortran 90. Eu tratar as rotinas numéricas e matemáticas muito em breve, Uma vez que não são alterados a partir do Fortran 77 e, portanto, devem ser bem conhecidos. Esta seção é baseada na seção 13 da norma ISO (1991), que contém um tratamento mais formal. Seguimos o arranjo das diferentes funções e sub-rotinas no padrão, mas explicamos diretamente na lista. Para um tratamento mais detalhado, referimo-nos a Metcalf e Reid (1990, 1993). Quando um parâmetro abaixo é opcional, é dado em letras minúsculas. Quando uma lista de argumentos contém vários argumentos, a função pode ser chamada por argumentos relacionados à posição ou por uma palavra-chave. Palavra-chave deve ser usado se algum argumento anterior não estiver incluído. Palavras-chave são normalmente os nomes que são dadas abaixo. Nós nem sempre damos todas as limitações naturais às variáveis, por exemplo, que a hierarquia não é permitida ser negativa. A função PRESENT (A) retorna. TRUE. Se o argumento A estiver na lista de chamadas,.FALSE. No outro caso. O uso é ilustrado no programa de exemplo no capítulo 8 do texto principal. Os seguintes itens estão disponíveis no Fortran 77: ABS, AIMAG, AINT, ANINT, CMPLX, CONJG, DBLE, DIM, DPROD, INT, MAX, MIN, MOD, NINT, REAL e SIGN. Além disso, o teto, piso e MODULO foram adicionados ao Fortran 90. Apenas o último é difícil de explicar, o que é mais facilmente feito com os exemplos da ISO (1991) As seguintes funções de Fortran 77 pode usar um parâmetro de tipo como Em AINT (A, tipo). Nomeadamente AINT, ANINT, CMPLX, INT, NINT e REAL. Um fato histórico é que as funções numéricas no Fortran 66 tiveram de ter nomes específicos (diferentes) em diferentes precisões, e esses nomes explícitos ainda são os únicos que podem ser usados ​​quando um nome de função é passado como um argumento. Uma tabela completa de todas as funções numéricas segue. Os nomes que são indicados com uma estrela não são permitidos para serem usados ​​como argumentos. Algumas funções, como INT e IFIX têm dois nomes específicos, ou podem ser usados. Por outro lado, algumas funções não têm qualquer nome específico. Abaixo, eu uso C para valores de ponto flutuante complexo, D para valores de ponto flutuante em precisão dupla, I para inteiros e R para valores de ponto flutuante em precisão simples. Truncamento é para zero, INT (-3,7) torna-se -3. Mas o arredondamento está correto, NINT (-3,7) torna-se -4. As novas funções FLOOR e CEILING truncam para menos e mais infinito, respectivamente. A função CMPLX pode ter um ou dois argumentos, se dois argumentos estiverem presentes estes devem ser do mesmo tipo mas não COMPLEX. A função MOD (X, Y) calcula X - INT (X / Y) Y. A função de transferência de sinal SIGN (X, Y) toma o sinal do segundo argumento e coloca-o no primeiro argumento, ABS (X) se Y gt 0 e - ABS (X) se Y lt 0. Diferença positiva DIM é uma função que eu nunca usei, mas DIM (X, Y) dá X-Y se isso é positivo e zero no outro caso. Produto interno DPROD, por outro lado é uma função muito útil que dá o produto de dois números em uma única precisão como um número de dupla precisão. É rápido e preciso. As duas funções MAX e MIN são únicas no sentido de que podem ter um número arbitrário de argumentos, mas pelo menos dois. Os argumentos têm de ser do mesmo tipo, mas não são permitidos para serem do tipo COMPLEX. Igual ao Fortran 77. Todas as funções trigonométricas funcionam em radianos. Estão disponíveis: ACOS, ASIN, ATAN, ATAN2, COS, COSH, EXP, LOG, LOG10, SIN, SINH, SQRT, TAN e TANH. Um fato histórico é que as funções matemáticas no Fortran 66 precisavam ter nomes específicos (diferentes) em diferentes precisões, e esses nomes explícitos ainda são os únicos que podem ser usados ​​quando um nome de função é passado como um argumento. Uma tabela completa de todas as funções matemáticas segue. Abaixo, eu uso C para valores de ponto flutuante complexo, D para valores de ponto flutuante em precisão dupla, I para inteiros e R para valores de ponto flutuante em precisão simples. O objetivo da maioria dessas funções é óbvio. Observe que eles são todos somente definidos para números de ponto flutuante e não para inteiros. Portanto, você não pode calcular a raiz quadrada de 4 como SQRT (4). Mas em vez disso você pode usar NINT (SQRT (REAL (4))). Observe também que todas as funções complexas retornam o valor principal. A raiz quadrada dá um resultado real para um argumento real em precisão simples ou dupla e um resultado complexo para um argumento complexo. Assim SQRT (-1.0) fornece uma mensagem de erro (geralmente já em tempo de compilação), enquanto você pode obter a raiz quadrada complexa usando as seguintes instruções. O argumento para os logaritmos usuais tem que ser positivo, enquanto o argumento para CLOG deve ser diferente de zero. O módulo para o argumento para ASIN e ACOS deve ser no máximo 1. O resultado será dentro de - pi / 2, pi / 2 e 0, pi, respectivamente. A função ATAN retornará um valor em - pi / 2, pi / 2. A função ATAN2 (Y, X) arctan (y, x) retornará um valor em (-pi, pi Se Y for positivo o resultado será positivo Se Y for zero o resultado será zero se X for positivo e Pi se X for negativo Se Y for negativo o resultado será negativo Se X for zero o resultado será mais ou menos pi / 2. Não é permitido que X e Y sejam simultaneamente zero. Evitar a divisão por zero. Uma limitação natural para as funções matemáticas é a precisão limitada e intervalo, o que significa que, por exemplo EXP pode causar subfluxo ou estouro em valores bastante comuns do argumento. As funções trigonométricas obterá uma precisão muito baixa para grandes argumentos. Essas limitações dependem da implementação e devem ser fornecidas no manual do fornecedor As funções abaixo executam operações de e para seqüências de caracteres Observe que o ACHAR funciona com o conjunto de caracteres ASCII padrão enquanto CHAR funciona com a representação no computador que você está usando. As rotinas acima comparam duas strings usando classificação de acordo com ASCII. Se uma seqüência de caracteres é mais curta que a outra, espaços em branco são adicionados no final da seqüência curta. Se uma string contém um caractere fora do conjunto de caracteres ASCII, o resultado é dependente da implementação. LEN (STRING) retorna o comprimento de uma seqüência de caracteres. Não é necessário atribuir um valor à variável STRING. O primeiro retorna o tipo do argumento real, que pode ser do tipo INTEGER, REAL, COMPLEX, LOGICAL ou CHARACTER. O argumento X não precisa ser atribuído qualquer valor. O segundo retorna um tipo inteiro com o número de dígitos solicitado eo terceiro retorna o tipo para números de ponto flutuante com precisão numérica pelo menos P dígitos e um intervalo exponencial decimal entre - R e R. Os parâmetros P e R devem ser inteiros escalares. Pelo menos um de P e R deve ser dado. O resultado de SELECTEDINTKIND é um inteiro a partir de zero e para cima, se o tipo desejado não estiver disponível, você obterá -1. Se vários tipos implementados satisfazem a condição, é usado aquele com o menor intervalo decimal. Se ainda houver vários tipos ou tipos que satisfaçam a condição, aquele com o menor número de tipo será usado. O resultado de SELECTEDREALKIND é também um inteiro a partir de zero e para cima se o tipo desejado não estiver disponível, então -1 é retornado se a precisão não estiver disponível, -2 se o intervalo do expoente não estiver disponível e -3 se nenhum dos requisitos Estão disponíveis. Se vários tipos implementados satisfazem a condição, é retornado aquele com a menor precisão decimal, e se houver vários deles, será retornado aquele com o menor número de tipo. Exemplos são dados no capítulo 2 do texto principal. Exemplos de tipos em algumas implementações diferentes (NAG e Cray) são dados no Apêndice 6. LOGICAL (L, tipo) converte entre diferentes tipos de variáveis ​​lógicas. Variáveis ​​lógicas podem ser implementadas de várias maneiras, por exemplo com uma representação física ocupando um bit (não recomendado), um byte, uma palavra ou talvez até uma palavra dupla. Esta diferença é importante se COMMON e EQUIVALENCE com variáveis ​​lógicas tiverem sido mal utilizados em um programa da forma tradicional da programação do Fortran 66. 8. Funções de pesquisa numérica: Estas funções funcionam com um certo modelo de aritmética de ponto flutuante e inteiro, ver ISO (1991), seção 13.7.1. As funções retornam propriedades de números do mesmo tipo que a variável X. Que pode ser real e em alguns casos inteiro. Funções que retornam propriedades do argumento real X estão disponíveis na seção 12 abaixo, funções de manipulação de ponto flutuante. BITSIZE (I) retorna o número de bits de acordo com o modelo de representação de bits na norma ISO (1991), seção 13.5.7. Normalmente, obtemos o número de bits em uma palavra (inteira). O modelo para representação de bits na norma ISO (1991), seção 13.5.7 é usado. TRANSFER (SOURCE, MOLD, size) especifica que a representação física do primeiro argumento SOURCE deve ser tratada como se tivesse tipo e parâmetros como o segundo argumento MOLD. Mas sem convertê-lo. O objetivo é dar a possibilidade de mover uma quantidade de um determinado tipo através de uma rotina que não tem exatamente esse tipo de dados. 12. Funções de manipulação de ponto flutuante: Essas funções funcionam em um determinado modelo de aritmética de ponto inteiro e flutuante, veja a norma ISO (1991), seção 13.7.1. As funções retornam números relacionados à variável real X do tipo REAL. Funções que retornam propriedades para os números do mesmo tipo que a variável X estão na seção 8 (Funções de indagação numérica). DOTPRODUCT (VECTORA, VECTORB) faz um produto escalar de dois vetores, que devem ter o mesmo comprimento (mesmo número de elementos). Por favor, note que se VECTORA é do tipo COMPLEX o resultado é SUM (CONJG (VECTORA) VECTORB). MATMIX (MATRIXA, MATRIXB) faz o produto da matriz de duas matrizes, que devem ser consistentes, isto é, têm as dimensões como (M, K) e (K, N). Usado no capítulo 11 do texto principal. 14. Funções de matriz: ALL (MASK, dim) retorna um valor lógico que indica se todas as relações em MASK são. TRUE. . Somente a dimensão desejada se o segundo argumento for dado. ANY (MASK, dim) retorna um valor lógico que indica se qualquer relação na MASK é. TRUE. . Somente a dimensão desejada se o segundo argumento for dado. COUNT (MASK, dim) retorna um valor numérico que é o número de relações em MASK que são. TRUE. . Somente a dimensão desejada se o segundo argumento for dado. MAXVAL (ARRAY, dim, máscara) retorna o maior valor na matriz ARRAY. Daqueles que obedecem à relação no terceiro argumento MASK se aquele for dado, somente ao lado da dimensão desejada se for dado o segundo argumento DIM. MINVAL (ARRAY, dim, máscara) retorna o menor valor na matriz ARRAY. Daqueles que obedecem à relação no terceiro argumento MASK se aquele for dado, somente ao lado da dimensão desejada se for dado o segundo argumento DIM. PRODUCT (ARRAY, dim, máscara) retorna o produto de todos os elementos na matriz ARRAY. Daqueles que obedecem à relação no terceiro argumento MASK se aquele for dado, somente ao lado da dimensão desejada se for dado o segundo argumento DIM. SUM (ARRAY, dim, máscara) retorna a soma de todos os elementos na matriz ARRAY. Daqueles que obedecem à relação no terceiro argumento MASK se aquele for dado, somente ao lado da dimensão desejada se for dado o segundo argumento DIM. Um exemplo é dado no Apêndice 3, seção 10. ALLOCATED (ARRAY) é uma função lógica que indica se a matriz é alocada. LBOUND (ARRAY, dim) é uma função que retorna o limite de dimensão inferior para o ARRAY. Se DIM (a dimensão) não é fornecido como um argumento, você obtém um vetor inteiro, se DIM estiver incluído, você obterá o valor inteiro com exatamente esse limite de dimensão inferior, para o qual você perguntou. SHAPE (SOURCE) é uma função que retorna a forma de uma matriz SOURCE como um vetor inteiro. SIZE (ARRAY, dim) é uma função que retorna o número de elementos em uma matriz ARRAY. Se DIM não for fornecido eo número de elementos na dimensão relevante se DIM estiver incluído. UBOUND (ARRAY, dim) é uma função semelhante a LBOUND que retorna os limites dimensionais superiores. MERGE (TSOURCE, FSOURCE, MASK) é uma função que une duas matrizes. Ele fornece os elementos em TSOURCE se a condição em MASK for. TRUE. E FSOURCE se a condição em MASK for. FALSE. Os dois campos TSOURCE e FSOURCE têm de ser do mesmo tipo e da mesma forma. O resultado também é deste tipo e desta forma. Também MASK deve ter a mesma forma. Aqui eu dou um exemplo bastante completo do uso de MERGE que também usa RESHAPE da próxima seção para construir matrizes de teste adequadas. Observe que as duas subrotinas WRITEARRAY e WRITELARRAY são rotinas de teste para escrever matrizes que no primeiro caso são de tipo REAL, no segundo caso de um tipo LOGICAL. A seguinte saída é obtida PACK (ARRAY, MASK, vector) pacotes de uma matriz para um vetor com o controle de MASK. A forma da matriz lógica MASK tem que concordar com a para ARRAY ou MASK deve ser um escalar. Se VECTOR estiver incluído, tem de ser uma matriz de grau 1 (ou seja, um vector) com pelo menos tantos elementos como aqueles que são verdadeiros em MASK e têm o mesmo tipo que ARRAY. Se MASK é um escalar com o valor. TRUE. Então VECTOR deve ter o mesmo número de elementos como ARRAY. O resultado é um vetor com tantos elementos como aqueles em ARRAY que obedecem as condições se VECTOR não está incluído (ou seja, todos os elementos se MASK é um escalar com valor. TRUE.). No outro caso, o número de elementos do resultado será tantas como em VECTOR. Os valores serão os aprovados, isto é, os valores que satisfazem a condição e estarão na ordem Fortran ordinária. Se VECTOR é incluído eo número de seus elementos excede o número de valores aprovados, os valores faltantes necessários para o resultado são retirados dos locais correspondentes em VECTOR. O exemplo a seguir é baseado na modificação do um para MERGE. Mas eu dou agora apenas os resultados. SPREAD (SOURCE, DIM, NCOPIES) retorna uma matriz do mesmo tipo que o argumento SOURCE com a classificação aumentada em um. Os parâmetros DIM e NCOPIES são inteiros. Se NCOPIES é negativo, o valor zero é usado em vez disso. Se SOURCE é um escalar, então SPREAD torna-se um vetor com elementos NCOPIES que todos têm o mesmo valor que SOURCE. O parâmetro DIM indica qual índice deve ser estendido. Tem de estar dentro do intervalo 1 e 1 (classificação de SOURCE). Se SOURCE é um escalar então DIM tem que ser um. O parâmetro NCOPIES é o número de elementos nas novas dimensões. Discussão adicional é dada na solução para o exercício (11.1). UNPACK (VECTOR, MASK, ARRAY) dispersa um vetor para um array sob controle de MASK. A forma da matriz lógica MASK tem de concordar com a de ARRAY. A matriz VECTOR tem que ter a classificação 1 (ou seja, é um vetor) com pelo menos tantos elementos como aqueles que são verdadeiros em MASK. E também tem que ter o mesmo tipo de ARRAY. Se ARRAY é dado como um escalar, então ele é considerado uma matriz com a mesma forma como MASK e os mesmos elementos escalares em toda parte. O resultado será uma matriz com a mesma forma como MASK eo mesmo tipo como VECTOR. Os valores serão os de VECTOR que são aceitos (isto é, os que cumprem a condição em MASK), tomados na ordem Fortran ordinária, enquanto nas posições restantes em ARRAY os valores antigos são mantidos. RESHAPE (SOURCE, SHAPE, pad, order) constrói uma matriz com uma forma SHAPE especificada a partir dos elementos de uma determinada matriz SOURCE. Se o PAD não estiver incluído, o tamanho de SOURCE tem de ser pelo menos PRODUCT (SHAPE). Se o PAD estiver incluído, ele deve ter o mesmo tipo de SOURCE. Se ORDER for incluída, tem que ser uma matriz INTEGER com a mesma forma que SHAPE e os valores devem ser uma permutação de (1,2,3. N), onde N é o número de elementos em SHAPE. Ele tem que ser menor ou igual a 7. O resultado tem, naturalmente, uma forma SHAPE e os elementos são aqueles em SOURCE. Possivelmente complementado com PAD. As diferentes dimensões foram permutadas na atribuição dos elementos se ORDER foi incluída, mas sem influenciar a forma do resultado. Alguns exemplos simples são dados na seção anterior e na próxima e também no Apêndice 3, seção 9. Um exemplo mais complicado, ilustrando também os argumentos opcionais, segue. A saída do programa acima é a seguinte. As funções shift retornam a forma de uma matriz inalterada, mas movem os elementos. Eles são bastante difíceis de explicar, então eu recomendo estudar também a norma ISO (1991). CSHIFT (ARRAY, SHIFT, dim) executa deslocamento circular por posições SHIFT para a esquerda se SHIFT for positivo e para a direita se for negativo. Se ARRAY for um vetor o deslocamento está sendo feito em uma maneira natural, se for uma disposição de um Rank mais elevado então o deslocamento está em todas as seções ao longo da dimensão DIM. Se DIM está faltando é considerado como 1, em outros casos tem que ser um número inteiro escalar entre 1 e n (onde n é igual ao grau de ARRAY). O argumento SHIFT é um inteiro escalar ou um array inteiro de classificação n-1 e da mesma forma que o ARRAY. Exceto ao longo da dimensão DIM (que é removida por causa da classificação inferior). Diferentes seções podem, portanto, ser deslocadas em várias direções e com vários números de posições. EOSHIFT (ARRAY, SHIFT, boundary, dim) realiza deslocamento para a esquerda se SHIFT for positivo e para a direita se for negativo. Em vez de os elementos deslocados para fora novos elementos são retirados do limite. Se ARRAY for um vetor o deslocamento está sendo feito em uma maneira natural, se for um arranjo de um Rank mais alto, o deslocamento em todas as seções é ao longo da dimensão DIM. Se DIM estiver faltando, ele é considerado como 1, em outros casos ele tem que ter um valor inteiro escalar entre 1 e n (onde n é igual ao grau de ARRAY). O argumento SHIFT é um inteiro escalar se ARRAY tem o rank 1, no outro caso pode ser um inteiro escalar ou um array inteiro de rank n-1 e com a mesma forma que o array ARRAY exceto ao longo da dimensão DIM (que é removida Por causa da classificação mais baixa). O correspondente aplica-se a BOUNDARY que tem de ter o mesmo tipo que o ARRAY. Se o parâmetro BOUNDARY estiver ausente, você terá a opção de valores zero,.FALSE. Ou em branco, dependendo do tipo de dados. Diferentes secções podem assim ser deslocadas em várias direcções e com vários números de posições. Um exemplo simples das duas funções acima para o caso de vetor segue, tanto o programa como a saída. Segue-se um exemplo simples das duas funções acima no caso da matriz. Eu tenho aqui usado RESHAPE, a fim de criar uma matriz adequada para começar a trabalhar com. O programa não é reproduzido aqui, apenas as principais declarações. TRANSPOSE (MATRIX) transpõe uma matriz, que é uma matriz de rank 2. Ela substitui as linhas e colunas na matriz. MAXLOC (ARRAY, máscara) retorna a posição do maior elemento na matriz ARRAY. Se a MÁSCARA é incluída somente para aquelas que cumprem as condições na MÁSCARA. O resultado é um vetor inteiro É usado na solução do exercício (11.1). MINLOC (ARRAY, máscara) retorna a posição do menor elemento na matriz ARRAY. Se a MÁSCARA é incluída somente para aquelas que cumprem as condições na MÁSCARA. O resultado é um vetor inteiro ASSOCIATED (POINTER, target) é uma função lógica que indica se o ponteiro POINTER está associado a algum alvo e se um TARGET específico é incluído indica se ele está associado exatamente com esse alvo. Se ambos POINTER e TARGET são ponteiros, o resultado é. TRUE. Somente se ambos estiverem associados com o mesmo destino. Remeto o leitor para o capítulo 12 do texto principal, Ponteiros. Uma sub-rotina que retorna a data, a hora eo fuso horário. Pelo menos um argumento tem que ser dado. DATE deve ser uma variável de cadeia de caracteres escalar com pelo menos 8 caracteres e é atribuído o valor CCYYMMDD para século, ano, mês e dia. Todos são dados numericamente, com espaços em branco se o sistema não incluir a data. TIME também deve ser uma variável de cadeia de caracteres escalar com pelo menos 10 caracteres e é atribuído um valor hhmmss. sss para o tempo em horas, minutos, segundos e milissegundos. Todos são dados numericamente com espaços em branco se o sistema não incluir um relógio. ZONE deve ser uma variável de cadeia de caracteres escalar com pelo menos 5 caracteres e é atribuído o valor hhmm para sinal, tempo em horas e minutos para a diferença de horário local com UTC (que foi anteriormente chamado Greenwich Mean Time). Todos são dados numericamente, com espaços em branco se o sistema não incluir um relógio. Em Sweden nós começamos assim 0100 no inverno e 0200 no verão, em Novosibirsk nós começamos 0700. A variável VALUES é, em vez disso, um vetor inteiro com pelo menos 8 elementos, que dá a maneira mais fácil de usar os resultados de DATEANDTIME nos cálculos em um programa. Se o sistema não incluir a data ou a hora em que você obtém o valor - HUGE (0). Que é o menor número inteiro no modelo, como saída. O vetor incluirá os seguintes elementos: ano, mês, dia, diferença de tempo em minutos. Horas, minutos, segundos e milissegundos. Sub-rotina que retorna a hora do sistema. Pelo menos um argumento tem que ser dado. COUNT é um inteiro escalar que é aumentado em um para cada ciclo até COUNTMAX. Onde começa novamente. Se não houver relógio do sistema então - HUGE (0) é retornado. COUNTRATE é um inteiro escalar que fornece o número de ciclos por segundo. Se não houver relógio do sistema, o valor zero será retornado. COUNTMAX é um inteiro escalar que dá o valor máximo que COUNT pode alcançar. Se não houver relógio do sistema, zero será retornado. Uma sub-rotina que copia a seqüência de bits em posição FROMPOS e tem o comprimento LEN para direcionar TO começando na posição TOPOS. Os bits restantes não são alterados. Todas as quantidades têm de ser inteiros e todos, exceto para ter que ter INENT (IN), enquanto TO é suposto ter INTENT (INOUT) e ser do mesmo tipo de tipo FROM. A mesma variável pode ser FROM e TO. Algumas restrições naturais se aplicam aos valores de LEN, FROMPOS e TOPOS e você também tem que considerar o valor de BITSIZE. Uma seqüência de números pseudo-aleatórios pode ser gerada a partir de um valor inicial que é armazenado como um vetor inteiro. As subrotinas oferecem uma interface portátil para uma sequência de números aleatórios dependentes da implementação. Esta subrotina retorna na variável de número de ponto flutuante HARVEST um (ou vários se HARVEST é uma matriz) números aleatórios entre zero e 1. Esta subrotina redefine ou fornece informações sobre o gerador de números aleatórios. Nenhum argumento tem que ser fornecido. A variável de saída SIZE deve ser um inteiro escalar e dá o número de inteiros (N) que o processador usa para o valor inicial. A variável de entrada PUT é um vetor inteiro que coloca os números iniciais fornecidos pelo usuário no gerador de números aleatórios. A variável de saída GET (também um vetor inteiro) lê o valor de partida atual. Exemplo: Um exemplo simples sobre o uso dessas funções está agora disponível. Introdução às Funções Intrínsecas de Fortrans Atribuição: Leia o Capítulo 4 e o exemplo trig. f. Muito antes de haver calculadoras científicas, cientistas e engenheiros perceberam que precisavam de maneiras fáceis de obter resultados de funções comuns como seno, cosseno, logaritmo natural e muitos mais. Essas necessidades foram consideradas com cada padrão Fortran, resultando em uma longa lista de funções embutidas (funções intrínsecas) para facilitar sua vida. Eu não vou cobrir todas as funções no padrão atual (Fortran 90), mas vai lhe dar algumas chaves nesta e discussões posteriores. A sintaxe para o uso de funções intrínsecas pode ser muito familiar para você, porque elas também aparecem em planilhas. Se eu inserir a magnitude de uma velocidade na caixa A1 e o ângulo entre a velocidade eo eixo x (em radianos) na caixa A2, então eu posso calcular a componente x da velocidade na caixa A3 com a fórmula A1COS A2). No Fortran, este resultado pode ser obtido com uma declaração de atribuição como velxvelcos (angrad). Antes de avançar, precisamos de uma definição simples. No exemplo acima angrad é um argumento da função cos. Algumas Funções Intrínsecas Básicas abs (x) - Valor absoluto de x iabs (I) - Valor absoluto de um inteiro I (pre-90 Fortran abs não gostavam de argumentos inteiros.) Sin (X) - Retorna o seno de x (x não é um inteiro) cos (x) - Retorna o cosseno de x (x não é um inteiro) tan (x) - Retorna a tangente de x (x não é um inteiro) (X) - calcula e (2.7183.) Para a potência x (x não é um inteiro) log (x) - calcula o logaritmo natural de x (x não é um inteiro e gt 0) log10 (x) 10 logaritmo de x (x não é um número inteiro e gt 0) asin (x) - Retorna o arcoseno (seno inverso) de x (x é real) acos (x) - Retorna o arccosine (coseno inverso) de x (X) - Retorna a aritangente (tangente inversa) de x (x é real) sqrt (x) - Retorna a raiz quadrada de x (x não é um inteiro e gt 0) nint (x) Inteiro para o número real x min (x1, x2.) - Retorna o mínimo de x1, x2. (Argumentos devem ser do mesmo tipo) max (x1, x2.) - Retorna o máximo de x1, x2. (Os argumentos devem ser do mesmo tipo) As funções max e min são incomuns, pois levam qualquer número de argumentos. As formas genéricas min e max não eram uma parte manditória do padrão Fortran 77, mas estão em Fortran 90. Em muitos códigos Fortran 77 você verá funções: amax1 (x1, x2.) - Retorna o máximo de x1, x2. Como um número real (os argumentos são reais) amax0 (i1, i2.) - Retorna o máximo de i1, i2. Como um número real (argumentos são inteiros) max0 (i1, i2.) - Retorna o máximo de i1, i2. Como um inteiro (argumentos são inteiros) max1 (x1, x2.) - Retorna o máximo de x1, x2. Como um inteiro (os argumentos são reais) Formas semelhantes apareceram para min. Além log e log10 eram formulários opcionais no Fortran 77. Programas mais antigos freqüentemente usam alog e alog10 para iniciar o nome da função com uma letra característica de um valor real em vez de inteiro. Em geral, o Fortran 77 era mais dependente de você escolher especificamente uma função apropriada para os tipos de argumento eo tipo de valor a ser retornado. Embora sobre o tema do Fortran 90 funções intrínsecas, vale a pena observar dois que você viu no exemplo ranges. f. E uma função relacionada, que são úteis em programas executando em uma gama de máquinas. (X) - Retorna o maior número positivo que pode ser representado no computador atual para o argumento real x (x) - Retorna o menor número positivo que pode ser representado no computador atual para x A uma precisão decimal aproximada disponível no computador atual para o argumento real x Alguns Comentários sobre a Velocidade Você precisa perceber que funções trigonométricas, log e exp intrínsecas são relativamente caras em termos de tempo de computador necessário. Se você precisar do valor de sin (0.1) freqüentemente, use a função uma vez em uma atribuição como: sin0p1 sin (0.1), então use a nova variável sin0p1 onde quer que sin (0.1) é needed. The alto custo de exp e log também é refletida Na utilização do operador. Normalmente, uma expressão como xy resulta no código de inserção do compilador equivalente a exp (ylog (x)). No entanto, a maioria dos compiladores são inteligentes o suficiente para perceber que se y é um número inteiro, eles podem usar uma ou mais multiplicações (x2xx, x3xxx, etc.). Esses compiladores contêm a lógica para conhecer o ponto de equilíbrio, em termos de tamanho de y, entre essa multiplicação ea combinação de exp e log. É sempre mais rápido para programar x2 do que x2.0, por isso tenha cuidado na sua escolha de tipos de expoentes. A velocidade também é um fator na existência da função intrínseca sqrt. Este é um algoritmo especial para calcular a raiz quadrada de um número, que é sempre mais rápido do que aumentar o número para a potência 0,5. Quando a opção existir, utilize sqrt (x) em vez de x0.5. Na minha experiência sqrt (sqrt (x)) é mais rápido do que x0.25. Enquanto estamos no assunto da velocidade, devemos rever a velocidade relativa de outras operações. Adicionar e subtrair são sempre os mais rápidos. Multiplicar vem em segundo lugar. Dividir é mais lento do que multiplicar, mas significativamente mais rápido do que sqrt. Se você vai dividir por uma variável x freqüentemente (mais de 2 ou 3 vezes), é uma boa idéia para definir outra variável dizer rx com a equação rx1./x, em seguida, multiplique por rx onde você teria dividido por x . Um Programa de Amostra usando Funções Intrínsecas Estude o programa de exemplo trig. f para exemplos de funções intrínsecas e como um começo útil para sua mais recente tarefa de casa. Perguntas de revisão Teste seu conhecimento deste material com algumas perguntas de revisão. Subir um nível / Início

No comments:

Post a Comment