Fortran 90 Moving Average
Médias móveis - Médias móveis simples e exponentes - Introdução simples e exponencial As médias móveis suavizam os dados de preços para formar um indicador de tendência seguinte. Eles não prevêem a direção do preço, mas sim definem a direção atual com um atraso. As médias móveis são desactualizadas porque se baseiam em preços passados. Apesar deste atraso, as médias móveis ajudam a melhorar a ação do preço e a eliminar o ruído. Eles também formam os blocos de construção para muitos outros indicadores técnicos e sobreposições, como Bollinger Bands. MACD e o McClellan Oscillator. Os dois tipos mais populares de médias móveis são a média móvel simples (SMA) e a média móvel exponencial (EMA). Essas médias móveis podem ser usadas para identificar a direção da tendência ou definir níveis potenciais de suporte e resistência. Aqui, um gráfico com um SMA e um EMA nele: Cálculo da média móvel simples Uma média móvel simples é formada calculando o preço médio de uma garantia em um período específico de períodos. A maioria das médias móveis baseia-se nos preços de fechamento. Uma média móvel simples de 5 dias é a soma de cinco dias de preços de fechamento dividida por cinco. Como o próprio nome indica, uma média móvel é uma média que se move. Os dados antigos são descartados à medida que novos dados estão disponíveis. Isso faz com que a média se mova ao longo da escala de tempo. Abaixo está um exemplo de uma média móvel de 5 dias evoluindo ao longo de três dias. O primeiro dia da média móvel cobre os últimos cinco dias. O segundo dia da média móvel diminui o primeiro ponto de dados (11) e adiciona o novo ponto de dados (16). O terceiro dia da média móvel continua diminuindo o primeiro ponto de dados (12) e adicionando o novo ponto de dados (17). No exemplo acima, os preços aumentam gradualmente de 11 para 17 durante um total de sete dias. Observe que a média móvel também aumenta de 13 para 15 durante um período de cálculo de três dias. Observe também que cada valor médio móvel está abaixo do último preço. Por exemplo, a média móvel para o dia 1 é igual a 13 e o último preço é 15. Os preços nos quatro dias anteriores foram menores e isso faz com que a média móvel atinja. Cálculo médio exponencial da movimentação As médias móveis exponentes reduzem o atraso aplicando mais peso aos preços recentes. A ponderação aplicada ao preço mais recente depende do número de períodos na média móvel. Existem três etapas para calcular uma média móvel exponencial. Primeiro, calcule a média móvel simples. Uma média móvel exponencial (EMA) tem que começar em algum lugar, de modo que uma média móvel simples é usada como EMA do período anterior em o primeiro cálculo. Segundo, calcule o multiplicador de ponderação. Em terceiro lugar, calcule a média móvel exponencial. A fórmula abaixo é para uma EMA de 10 dias. Uma média móvel exponencial de 10 períodos aplica uma ponderação de 18.18 ao preço mais recente. Um EMA de 10 períodos também pode ser chamado de 18.18 EMA. Um EMA de 20 períodos aplica uma pesagem de 9,52 ao preço mais recente (2 (201) .0952). Observe que a ponderação para o período de tempo mais curto é maior do que a ponderação para o período de tempo mais longo. Na verdade, a ponderação cai pela metade cada vez que o tempo médio móvel dobra. Se você quer uma porcentagem específica para um EMA, pode usar esta fórmula para convertê-la em períodos de tempo e, em seguida, insira esse valor como o parâmetro EMA039s: abaixo é um exemplo de planilha de uma média móvel simples de 10 dias e um 10- Média móvel exponencial do dia para a Intel. As médias móveis simples são diretas e requerem pouca explicação. A média de 10 dias simplesmente se move à medida que novos preços se tornam disponíveis e os preços antigos caem. A média móvel exponencial começa com o valor médio móvel simples (22.22) no primeiro cálculo. Após o primeiro cálculo, a fórmula normal assume o controle. Como um EMA começa com uma média móvel simples, seu valor verdadeiro não será realizado até 20 ou mais períodos mais tarde. Em outras palavras, o valor na planilha do Excel pode diferir do valor do gráfico devido ao curto período de visualização. Esta planilha apenas remonta a 30 períodos, o que significa que o efeito da média móvel simples teve 20 períodos para se dissipar. StockCharts remonta pelo menos 250 períodos (geralmente muito mais) para os seus cálculos, de modo que os efeitos da média móvel simples no primeiro cálculo foram totalmente dissipados. O Factor de Lag. Quanto maior a média móvel, mais o atraso. Uma média móvel exponencial de 10 dias irá reduzir os preços de forma bastante próxima e virar-se pouco depois que os preços se transformarem. As médias de curto movimento são como barcos de velocidade - ágeis e rápidos de mudar. Em contraste, uma média móvel de 100 dias contém muitos dados passados que o retardam. As médias móveis mais longas são como os petroleiros oceânicos - letárgicos e lentos para mudar. É necessário um movimento de preços maior e mais longo para uma média móvel de 100 dias para mudar de curso. O gráfico acima mostra o ETF SampP 500 com um EMA de 10 dias seguindo os preços e uma moagem de SMA de 100 dias mais alta. Mesmo com o declínio de janeiro a fevereiro, o SMA de 100 dias manteve o curso e não recusou. O SMA de 50 dias se encaixa em algum lugar entre as médias móveis de 10 a 100 dias quando se trata do fator de atraso. Médias móveis simples e exponentes Mesmo que existam diferenças claras entre as médias móveis simples e as médias móveis exponenciais, uma não é necessariamente melhor do que a outra. As médias móveis exponentes têm menos atraso e, portanto, são mais sensíveis aos preços recentes - e as recentes mudanças nos preços. As médias móveis exponentes virão antes das médias móveis simples. As médias móveis simples, por outro lado, representam uma verdadeira média de preços durante todo o período de tempo. Como tal, as médias móveis simples podem ser mais adequadas para identificar níveis de suporte ou resistência. A preferência média móvel depende dos objetivos, do estilo analítico e do horizonte temporal. Os cartistas devem experimentar com os dois tipos de médias móveis, bem como diferentes prazos para encontrar o melhor ajuste. O gráfico abaixo mostra a IBM com o SMA de 50 dias em vermelho e a EMA de 50 dias em verde. Ambos atingiram o pico no final de janeiro, mas o declínio no EMA foi mais acentuado do que o declínio no SMA. A EMA apareceu em meados de fevereiro, mas a SMA continuou abaixo até o final de março. Observe que o SMA apareceu mais de um mês após o EMA. Comprimentos e prazos O comprimento da média móvel depende dos objetivos analíticos. As médias de curto movimento (5-20 períodos) são mais adequadas para tendências e negociações de curto prazo. Chartists interessados em tendências de médio prazo optaram por médias móveis mais longas que poderiam prolongar 20-60 períodos. Os investidores de longo prazo preferirão médias móveis com 100 ou mais períodos. Alguns comprimentos médios móveis são mais populares do que outros. A média móvel de 200 dias é talvez a mais popular. Devido ao seu comprimento, esta é claramente uma média móvel a longo prazo. Em seguida, a média móvel de 50 dias é bastante popular para a tendência de médio prazo. Muitos cartéescos usam as médias móveis de 50 dias e 200 dias em conjunto. A curto prazo, uma média móvel de 10 dias era bastante popular no passado porque era fácil de calcular. Simplesmente adicionou os números e moveu o ponto decimal. Identificação da tendência Os mesmos sinais podem ser gerados usando médias móveis simples ou exponenciais. Conforme mencionado acima, a preferência depende de cada indivíduo. Estes exemplos abaixo usarão médias móveis simples e exponenciais. O termo média móvel aplica-se a médias móveis simples e exponenciais. A direção da média móvel transmite informações importantes sobre os preços. Uma média móvel ascendente mostra que os preços geralmente aumentam. Uma média decrescente indica que os preços, em média, estão caindo. Uma média móvel crescente a longo prazo reflete uma tendência de alta de longo prazo. Uma média móvel decrescente a longo prazo reflete uma tendência de baixa de longo prazo. O gráfico acima mostra 3M (MMM) com uma média móvel exponencial de 150 dias. Este exemplo mostra o quão bem as médias móveis funcionam quando a tendência é forte. A EMA de 150 dias desistiu em novembro de 2007 e novamente em janeiro de 2008. Observe que demorou 15 para reverter a direção dessa média móvel. Esses indicadores de atraso identificam inversões de tendência à medida que ocorrem (na melhor das hipóteses) ou após ocorrerem (na pior das hipóteses). O MMM continuou a baixar em março de 2009 e depois aumentou 40-50. Observe que o EMA de 150 dias não apareceu até depois desse aumento. Uma vez que fez, no entanto, MMM continuou mais alto nos próximos 12 meses. As médias móveis funcionam de forma brilhante em fortes tendências. Crossovers duplos Duas médias móveis podem ser usadas em conjunto para gerar sinais cruzados. Na Análise Técnica dos Mercados Financeiros. John Murphy chama isso de método de cruzamento duplo. Os cruzamentos duplos envolvem uma média móvel relativamente curta e uma média móvel relativamente longa. Tal como acontece com todas as médias móveis, o comprimento geral da média móvel define o prazo para o sistema. Um sistema que utilize um EMA de 5 dias e EMA de 35 dias seria considerado de curto prazo. Um sistema que usa SMA de 50 dias e SMA de 200 dias seria considerado de médio prazo, talvez até de longo prazo. Um cruzamento de alta ocorre quando a média móvel mais curta cruza acima da média móvel mais longa. Isso também é conhecido como uma cruz dourada. Um cruzamento de baixa ocorre quando a média móvel mais curta passa abaixo da média móvel mais longa. Isso é conhecido como uma cruz morta. Os fluxos médios móveis produzem sinais relativamente atrasados. Afinal, o sistema emprega dois indicadores de atraso. Quanto mais longos os períodos médios móveis, maior o atraso nos sinais. Esses sinais funcionam bem quando uma boa tendência se apodera. No entanto, um sistema de cruzamento médio móvel produzirá muitos whipsaws na ausência de uma forte tendência. Há também um método de cruzamento triplo que envolve três médias móveis. Novamente, um sinal é gerado quando a média móvel mais curta cruza as duas médias móveis mais longas. Um simples sistema de cruzamento triplo pode envolver médias móveis de 5 dias, 10 dias e 20 dias. O gráfico acima mostra Home Depot (HD) com EMA de 10 dias (linha pontilhada verde) e EMA de 50 dias (linha vermelha). A linha preta é o fechamento diário. O uso de um crossover médio móvel resultaria em três whipsaws antes de pegar um bom comércio. A EMA de 10 dias quebrou abaixo da EMA de 50 dias no final de outubro (1), mas isso não durou tanto quanto o 10 dias se movia de volta acima em meados de novembro (2). Esta cruz durou mais tempo, mas o próximo cruzamento de baixa em janeiro (3) ocorreu perto dos níveis de preços finais de novembro, resultando em outro whipsaw. Esta cruz descendente não durou tanto quanto a EMA de 10 dias voltou atrás dos 50 dias alguns dias depois (4). Depois de três sinais negativos, o quarto sinal anunciou um forte movimento, já que o estoque avançou acima de 20. Há duas coisas para levar aqui. Primeiro, os cruzamentos são propensos a whipsaw. Um filtro de preço ou tempo pode ser aplicado para ajudar a evitar whipsaws. Os comerciantes podem exigir que o crossover durar 3 dias antes de atuar ou exigir que a EMA de 10 dias se mova acima da EMA de 50 dias por uma certa quantidade antes de agir. Em segundo lugar, o MACD pode ser usado para identificar e quantificar esses cruzamentos. MACD (10,50,1) mostrará uma linha que representa a diferença entre as duas médias móveis exponenciais. O MACD se torna positivo durante uma cruz dourada e negativo durante uma cruz morta. O Percentage Price Oscillator (PPO) pode ser usado da mesma maneira para mostrar diferenças percentuais. Note-se que o MACD e o PPO são baseados em médias móveis exponenciais e não combinam com médias móveis simples. Este gráfico mostra Oracle (ORCL) com EMA de 50 dias, EMA de 200 dias e MACD (50.200,1). Havia quatro passagens médias móveis ao longo de um período de 2 12 anos. Os três primeiros resultaram em whipsaws ou negócios ruins. Uma tendência sustentada começou com o quarto crossover, já que a ORCL avançou até o meio da década de 20. Mais uma vez, os cruzamentos médios móveis funcionam bem quando a tendência é forte, mas produzem perdas na ausência de uma tendência. Crossovers de preços As médias móveis também podem ser usadas para gerar sinais com crossovers de preços simples. Um sinal de alta é gerado quando os preços se movem acima da média móvel. Um sinal de baixa é gerado quando os preços se movem abaixo da média móvel. Os cruzamentos de preços podem ser combinados para negociar dentro da tendência maior. A média móvel mais longa define o tom para a tendência maior e a média móvel mais curta é usada para gerar os sinais. Um seria procurar cruzes de preços otimistas somente quando os preços já estão acima da média móvel mais longa. Isso seria negociado em harmonia com a maior tendência. Por exemplo, se o preço estiver acima da média móvel de 200 dias, os chartists só se concentrarão em sinais quando o preço se mova acima da média móvel de 50 dias. Obviamente, um movimento abaixo da média móvel de 50 dias precederia esse sinal, mas tais cruzes de baixa seria ignoradas porque a maior tendência foi aumentada. Uma cruz grosseira simplesmente sugeriria uma retração dentro de uma maior tendência de alta. Uma cruzada acima da média móvel de 50 dias indicaria uma recuperação dos preços e a continuação da maior tendência de alta. O próximo gráfico mostra Emerson Electric (EMR) com EMA de 50 dias e EMA de 200 dias. O estoque moveu-se acima e manteve-se acima da média móvel de 200 dias em agosto. Havia mergulhos abaixo da EMA de 50 dias no início de novembro e novamente no início de fevereiro. Os preços rapidamente se movimentaram atrás do EMA de 50 dias para fornecer sinais de alta (setas verdes) em harmonia com a maior tendência de alta. MACD (1,50,1) é mostrado na janela do indicador para confirmar cruzamentos de preços acima ou abaixo do EMA de 50 dias. A EMA de 1 dia é igual ao preço de fechamento. MACD (1,50,1) é positivo quando o fechamento está acima do EMA de 50 dias e negativo quando o fechamento está abaixo da EMA de 50 dias. Suporte e resistência As médias móveis também podem atuar como suporte em uma tendência de alta e resistência em uma tendência de baixa. Uma tendência de alta de curto prazo pode encontrar suporte perto da média móvel simples de 20 dias, que também é usada em Bandas de Bollinger. Uma tendência de alta de longo prazo pode encontrar suporte perto da média móvel simples de 200 dias, que é a média móvel mais popular a longo prazo. De fato, a média móvel de 200 dias pode oferecer suporte ou resistência simplesmente porque é tão amplamente utilizada. É quase como uma profecia auto-realizável. O gráfico acima mostra o NY Composite com a média móvel simples de 200 dias de meados de 2004 até o final de 2008. Os 200 dias fornecidos suportam várias vezes durante o avanço. Uma vez que a tendência invertida com uma quebra de suporte de topo duplo, a média móvel de 200 dias atuou como resistência em torno de 9500. Não espere um suporte exato e níveis de resistência a partir de médias móveis, especialmente médias móveis mais longas. Os mercados são impulsionados pela emoção, o que os torna propensos a superar. Em vez de níveis exatos, as médias móveis podem ser usadas para identificar zonas de suporte ou de resistência. Conclusões As vantagens de usar médias móveis precisam ser ponderadas contra as desvantagens. As médias móveis são seguidores de tendência, ou atrasos, indicadores que sempre estarão um passo atrás. Isso não é necessariamente uma coisa ruim. Afinal, a tendência é seu amigo e é melhor negociar na direção da tendência. As médias móveis asseguram que um comerciante esteja em linha com a tendência atual. Embora a tendência seja sua amiga, os títulos gastam uma grande quantidade de tempo nas gamas de negociação, o que torna as médias móveis ineficazes. Uma vez em uma tendência, as médias móveis o manterão, mas também darão sinais tardios. Don039t espera vender no topo e comprar no fundo usando médias móveis. Tal como acontece com a maioria das ferramentas de análise técnica, as médias móveis não devem ser usadas por conta própria, mas em conjunto com outras ferramentas complementares. Os cartistas podem usar médias móveis para definir a tendência geral e, em seguida, usar RSI para definir níveis de sobrecompra ou sobrevenda. Adicionando médias móveis para gráficos de ações A média móvel está disponível como um recurso de sobreposição de preço na bancada de trabalho SharpCharts. Usando o menu suspenso Overlays, os usuários podem escolher uma média móvel simples ou uma média móvel exponencial. O primeiro parâmetro é usado para definir o número de períodos de tempo. Um parâmetro opcional pode ser adicionado para especificar qual campo de preço deve ser usado nos cálculos - O para Open, H para High, L para Low e C para o Close. Uma vírgula é usada para separar os parâmetros. Outro parâmetro opcional pode ser adicionado para mudar as médias móveis para o lado esquerdo (passado) ou para a direita (futuro). Um número negativo (-10) deslocaria a média móvel para os 10 períodos esquerdos. Um número positivo (10) deslocaria a média móvel para os 10 períodos certos. Várias médias móveis podem ser sobrepostas ao gráfico de preços, simplesmente adicionando outra linha de sobreposição ao banco de trabalho. Os membros do StockCharts podem alterar as cores e o estilo para diferenciar entre médias móveis múltiplas. Depois de selecionar um indicador, abra Opções avançadas clicando no pequeno triângulo verde. Opções avançadas também podem ser usadas para adicionar uma sobreposição média móvel a outros indicadores técnicos como RSI, CCI e Volume. Clique aqui para obter um gráfico ao vivo com várias médias móveis diferentes. Usando Médias em Movimento com Análises de StockCharts Aqui estão algumas varreduras de amostra que os membros do StockCharts podem usar para escanear várias situações de média móvel: Cruzada média movimentada de Bullish: Esta varredura procura ações com uma média móvel crescente de 150 dias e uma cruz de alta dos 5 EMA EMA e EMA de 35 dias. A média móvel de 150 dias está aumentando, desde que esteja negociando acima do nível cinco dias atrás. Uma cruz de alta ocorre quando o EMA de 5 dias se move acima do EMA de 35 dias no volume acima da média. Croácia média baixa de Bearish: esta pesquisa procura ações com uma média móvel decrescente de 150 dias e uma cruz descendente da EMA de 5 dias e EMA de 35 dias. A média móvel de 150 dias está caindo enquanto estiver negociando abaixo do nível cinco dias atrás. Uma cruz descendente ocorre quando a EMA de 5 dias se move abaixo da EMA de 35 dias no volume acima da média. Estudo adicional O livro de John Murphy039 tem um capítulo dedicado às médias móveis e seus vários usos. Murphy cobre os prós e contras das médias móveis. Além disso, Murphy mostra como as médias móveis funcionam com Bollinger Bands e sistemas de negociação baseados em canais. Análise técnica dos mercados financeiros John MurphyAPPENDICE 5 Funções intrínsecas em Fortran 90 Há uma grande quantidade de funções intrínsecas e cinco sub-rotinas intrínsecas no Fortran 90. Trato as rotinas numéricas e matemáticas muito em breve, uma vez que não são alteradas de Fortran 77 e Portanto, deve ser bem conhecido. Esta seção é baseada na seção 13 do padrão 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, nos referimos a Metcalf e Reid (1990, 1993). Quando um parâmetro abaixo é opcional, ele é dado em 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. A palavra-chave deve ser usada se algum argumento anterior não estiver incluído. As palavras-chave normalmente são os nomes que são apresentados abaixo. Nem sempre damos todas as limitações naturais às variáveis, por exemplo, que a classificação não pode 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. O seguinte está disponível no Fortran 77: ABS, AIMAG, AINT, ANINT, CMPLX, CONJG, DBLE, DIM, DPROD, INT, MAX, MIN, MOD, NINT, REAL e SIGN. Além disso, o CEILING, o FLOOR e o MODULO foram adicionados ao Fortran 90. Somente o último é difícil de explicar, o que é mais fácil de usar com os exemplos do ISO (1991). As seguintes funções do Fortran 77 podem usar um parâmetro tipo como Em AINT (A, tipo). AINT, ANINT, CMPLX, INT, NINT e REAL. Um fato histórico é que as funções numéricas no Fortran 66 tiveram que ter nomes específicos (diferentes) em precisões diferentes, 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 podem ser usados como argumentos. Algumas funções, como INT e IFIX, têm dois nomes específicos, que podem ser usados. Por outro lado, algumas funções não têm nenhum nome específico. Abaixo, uso C para valores de ponto flutuante complexos, D para valores de ponto flutuante em dupla precisão, I para números inteiros e R para valores de ponto flutuante em uma única precisão. O 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 em sentido negativo 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 COMPLEXOS. A função MOD (X, Y) calcula X-INT (XY) Y. A função de transferência de sinal SIGN (X, Y) assume o sinal do segundo argumento e o coloca no primeiro argumento, ABS (X) se Y gt 0 e - ABS (X) se Y lt 0. Diferença positiva DIM é uma função que nunca usei, mas DIM (X, Y) dá X-Y se esta for positiva e zero no outro caso. O produto interno DPROD, por outro lado, é uma função muito útil que fornece 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 na medida em que podem ter um número arbitrário de argumentos, mas pelo menos dois. Os argumentos devem ser do mesmo tipo, mas não podem ser do tipo COMPLEX. O mesmo que no 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 tiveram que ter nomes específicos (diferentes) em precisões diferentes, 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, uso C para valores de ponto flutuante complexos, D para valores de ponto flutuante em dupla precisão, I para números inteiros e R para valores de ponto flutuante em uma única precisão. O objetivo da maioria dessas funções é óbvio. Note que todos eles são apenas definidos para números de ponto flutuante e não para números 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 simples ou dupla precisão, e um resultado complexo para um argumento complexo. Portanto, SQRT (-1.0) dá uma mensagem de erro (geralmente já no 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 - pi2, pi2 e 0, pi, respectivamente. A função ATAN retornará um valor em - pi2, pi2. A função ATAN2 (Y, X) arctan (y, x) retornará um valor em (-pi, pi. Se Y é positivo, o resultado será positivo. Se Y é zero, o resultado será zero se X for positivo e Pi se X é negativo. Se Y é negativo, o resultado será negativo. Se X for zero, o resultado será mais ou menos pi2. Tanto o X quanto o Y não podem ser zero simultaneamente. O objetivo da função é evitar a divisão Por zero. Uma limitação natural para as funções matemáticas é a precisão e alcance limitados, o que significa que, por exemplo, EXP pode causar subfluível ou transbordar em valores bastante comuns do argumento. As funções trigonométricas obterão uma precisão muito baixa para grandes argumentos. São dependentes da implementação e devem ser fornecidos no manual dos vendedores. As funções abaixo executam operações de e para as seqüências de caracteres. Observe que o ACHAR trabalha com o conjunto de caracteres ASCII padrão, enquanto o CHAR funciona com a representação no computador que você está usando. Rotinas com Pare duas cordas usando a classificação de acordo com ASCII. Se uma string for menor do que a outra, os espaços em branco são adicionados no final da string 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 a nenhum valor. O segundo retorna um tipo inteiro com o número de dígitos solicitado e o terceiro retorna o tipo para números de ponto flutuante com precisão numérica, pelo menos, dígitos P e um intervalo exponencial decimal entre - R e R. Os parâmetros P e R devem ser números inteiros escalares. Pelo menos um de P e R deve ser dado. O resultado de SELECTEDINTKIND é um número inteiro de zero e para cima, se o tipo desejado não estiver disponível, você obterá -1. Se vários tipos implementados satisfizerem a condição, é usado o que possui o menor intervalo decimal. Se ainda houver vários tipos ou tipos que satisfaçam a condição, será usado o com o menor número amável. O resultado de SELECTEDREALKIND também é um número inteiro de zero e para cima se o tipo desejado não estiver disponível e, em seguida, -1 é retornado se a precisão não estiver disponível, -2 se o intervalo exponente não estiver disponível e -3 se nenhum dos requisitos Estão disponíveis. Se vários tipos implementados satisfizerem a condição, aquele com a menor precisão decimal é retornado, e se houver vários deles, aquele com o número menos gentil é retornado. Exemplos são apresentados no capítulo 2 do texto principal. Exemplos de tipos em algumas implementações diferentes (NAG e Cray) são fornecidos no Apêndice 6. LOGICAL (L, kind) converte entre diferentes tipos de variáveis lógicas. As 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. Essa diferença é importante se COMMON e EQUIVALENCE com variáveis lógicas tiverem sido mal utilizados em um programa da maneira tradicional da programação Fortran 66. 8. Funções de indicação numérica: estas funções funcionam com um certo modelo de aritmética de número inteiro e ponto flutuante, 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. As 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 no padrão ISO (1991), seção 13.5.7. Normalmente, obtemos o número de bits em uma (toda) palavra. O modelo para a representação de bits no ISO padrão (1991), seção 13.5.7 é usado. TRANSFER (SOURCE, MOLD, tamanho) 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 tenha 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 número inteiro e ponto flutuante, veja o ISO padrão (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 consulta numérica). DOTPRODUCT (VECTORA, VECTORB) faz um produto escalar de dois vetores, que devem ter o mesmo comprimento (mesmo número de elementos). Observe que, se VECTORA for do tipo COMPLEX, o resultado é SUM (CONJG (VECTORA) VECTORB). MATMUL (MATRIXA, MATRIXB) faz o produto de matriz de duas matrizes, que devem ser consistentes, ou seja, 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. . Ao longo da dimensão desejada, se o segundo argumento for dado. QUALQUER (MASK, dim) retorna um valor lógico que indica se qualquer relação em MASK é. TRUE. . Ao longo da 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. . Ao longo da dimensão desejada, se o segundo argumento for dado. MAXVAL (ARRAY, dim, mask) retorna o maior valor na matriz ARRAY. Daqueles que obedecem à relação na terceira argumentação MASK se essa for dada, ao longo de apenas a dimensão desejada se o segundo argumento DIM for dado. MINVAL (ARRAY, dim, mask) retorna o menor valor no array ARRAY. Daqueles que obedecem à relação na terceira argumentação MASK se essa for dada, ao longo de apenas a dimensão desejada se o segundo argumento DIM for dado. PRODUCT (ARRAY, dim, mask) retorna o produto de todos os elementos no array ARRAY. Daqueles que obedecem à relação na terceira argumentação MASK se essa for dada, ao longo de apenas a dimensão desejada se o segundo argumento DIM for dado. SUM (ARRAY, dim, máscara) retorna a soma de todos os elementos na matriz ARRAY. Daqueles que obedecem à relação na terceira argumentação MASK se essa for dada, ao longo de apenas a dimensão desejada se o segundo argumento DIM for dado. Um exemplo é dado no Apêndice 3, seção 10. ALLOCATED (ARRAY) é uma função lógica que indica se a matriz está 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 for dado como um argumento, você obtém um vetor inteiro, se o DIM estiver incluído, você obtém o valor inteiro exatamente com o 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 dado e o número de elementos na dimensão relevante se DIM estiver incluído. UBOUND (ARRAY, dim) é uma função semelhante à LBOUND que retorna os limites dimensionais superiores. MERGE (TSOURCE, FSOURCE, MASK) é uma função que junta dois arrays. 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 devem ser do mesmo tipo e da mesma forma. O resultado é também deste tipo e dessa forma. Também a MÁSCARA deve ter a mesma forma. Aqui, damos um exemplo bastante completo do uso do MERGE que também usa o RESHAPE da próxima seção para criar matrizes de teste adequadas. Observe que as duas sub-rotinas WRITEARRAY e WRITELARRAY são rotinas de teste para escrever matrizes que, no primeiro caso, são de tipo REAL, no segundo caso de tipo LOGICAL. A seguinte saída é obtida PACK (ARRAY, MASK, vetor) embala uma matriz para um vetor com o controle de MASK. A forma da matriz lógica MASK tem de concordar com a de ARRAY ou MASK deve ser um escalar. Se VECTOR estiver incluído, deve ser uma matriz de rank 1 (ou seja, um vetor) com pelo menos tantos elementos como aqueles que são verdadeiros em MASK e têm o mesmo tipo de ARRAY. Se MASK for um escalar com o valor. TRUE. Então o VECTOR deve ter o mesmo número de elementos que ARRAY. O resultado é um vetor com tantos elementos como aqueles em ARRAY que obedecem às condições se VECTOR não estiver incluído (ou seja, todos os elementos se MASK for um escalar com valor. TRUE). No outro caso, o número de elementos do resultado será igual ao do VECTOR. Os valores serão os aprovados, ou seja, os valores que atendem a condição e estarão na ordem Fortran normal. Se o VECTOR estiver incluído e o número de seus elementos exceder o número de valores aprovados, os valores de falta necessários para o resultado são retirados dos locais correspondentes no VECTOR. O exemplo a seguir é baseado na modificação de 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 for negativo, o valor zero é usado. Se SOURCE for 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 que estar dentro do intervalo 1 e 1 (classificação de SOURCE). Se a FONTE for um escalar, então a DIM tem que ser uma. O parâmetro NCOPIES é o número de elementos nas novas dimensões. Uma discussão adicional é dada na solução para o exercício (11.1). UNPACK (VECTOR, MASK, ARRAY) dispersa um vetor para uma matriz sob o controle de MASK. A forma da matriz lógica MASK tem de concordar com a de ARRAY. A matriz VECTOR tem que ter o ranking 1 (isto é, um vetor) com pelo menos tantos elementos como aqueles que são verdadeiros na MÁSCARA. E também tem que ter o mesmo tipo de ARRAY. Se ARRAY for dado como um escalar, então ele é considerado uma matriz com a mesma forma de MASK e os mesmos elementos escalares em todos os lugares. O resultado será uma matriz com a mesma forma como MASK e do mesmo tipo que VECTOR. Os valores serão aqueles de VECTOR que são aceitos (ou seja, aqueles que cumprem a condição em MASK), tomados na ordem Fortran comum, 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 especificada SHAPE a partir dos elementos em uma dada fonte SOURCE. Se o PAD não estiver incluído, então o tamanho da SOURCE deve ser pelo menos PRODUCT (SHAPE). Se o PAD estiver incluído, ele deve ter o mesmo tipo de SOURCE. Se ORDER estiver incluído, deve 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. 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ído, mas sem influenciar a forma do resultado. Alguns exemplos simples são apresentados na seção anterior e na próxima e também no Apêndice 3, seção 9. Um exemplo mais complicado, que ilustra também os argumentos opcionais, segue. A saída do programa acima é a seguinte. As funções de mudança 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 o ISO padrão (1991). CSHIFT (ARRAY, SHIFT, dim) executa deslocamento circular por posições SHIFT para a esquerda se SHIFT for positivo e à direita se for negativo. Se ARRAY é um vetor, a mudança está sendo feita de forma natural, se for uma matriz de uma classificação mais alta, então a mudança está em todas as seções ao longo da dimensão DIM. Se DIM estiver faltando, é considerado 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 uma matriz de número inteiro de rank n-1 e a mesma forma que o ARRAY. Exceto ao longo da dimensão DIM (que é removido por causa da classificação mais baixa). Diferentes seções podem, portanto, ser deslocadas em várias direções e com vários números de posições. EOSHIFT (ARRAY, SHIFT, limite, dim) executa shift para a esquerda se SHIFT for positivo e à direita se for negativo. Em vez de os elementos deslocados, novos elementos são retirados de BOUNDARY. Se ARRAY é um vetor, a mudança está sendo feita de forma natural, se for uma matriz de maior classificação, a mudança em todas as seções é ao longo da dimensão DIM. Se DIM estiver faltando, é considerado 1, em outros casos, ele deve ter um valor inteiro escalar entre 1 e n (onde n é igual ao grau de ARRAY). O argumento SHIFT é um inteiro escalar se o ARRAY tiver o ranking 1, no outro caso, pode ser um inteiro escalar ou uma matriz inteira 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 ao BOUNDARY que deve ter o mesmo tipo que o ARRAY. Se o parâmetro BOUNDARY estiver faltando você tem a escolha de valores zero,.FALSE. Ou em branco sendo usado, dependendo do tipo de dados. Diferentes seções podem assim ser deslocadas em várias direções e com vários números de posições. Um exemplo simples das duas funções acima para o caso do vetor segue, tanto o programa como a saída. Um exemplo simples das duas funções acima no caso da matriz segue. Eu usei aqui o RESHAPE para criar uma matriz adequada para começar a trabalhar. O programa não é reproduzido aqui, apenas as principais declarações. TRANSPOSE (MATRIX) transpõe uma matriz, que é uma matriz de classificação 2. Ele substitui as linhas e as colunas na matriz. MAXLOC (ARRAY, máscara) retorna a posição do maior elemento na matriz ARRAY. Se MASK estiver incluído apenas para aqueles que satisfaçam as condições em MASK. O resultado é um vetor inteiro. Ele é usado na solução do exercício (11.1). MINLOC (ARRAY, máscara) retorna a posição do elemento mais pequeno na matriz ARRAY. Se MASK estiver incluído apenas para aqueles que satisfaçam as condições em MASK. O resultado é um vetor inteiro ASSOCIADO (POINTER, target) é função lógica que indica se o POINTER do ponteiro está associado a algum alvo, e se um TARGET específico estiver incluído, ele indica se ele está associado exatamente a esse alvo. Se tanto POINTER como TARGET são ponteiros, o resultado é. TRUE. Somente se ambos estiverem associados ao mesmo alvo. Refiro o leitor ao capítulo 12 do texto principal, Ponteiros. Uma sub-rotina que retorna a data, o horário e o fuso horário. Pelo menos um argumento deve ser dado. DATE deve ser uma variável de caracteres de caracteres escalares com pelo menos 8 caracteres e o valor CCYYMMDD é atribuído por 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 caracteres de caracteres escalares com pelo menos 10 caracteres e é atribuído um valor hhmmss. sss por 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 caracteres de caracteres escalares com pelo menos 5 caracteres e é atribuído o valor hhmm para o sinal, o tempo em horas e os minutos para a diferença de horário local com o UTC (que anteriormente era chamado Greenwich Mean Time). Todos são dados numericamente, com espaços em branco se o sistema não incluir um relógio. Na Suécia, obtemos 0100 no inverno e 0200 no verão, em Novosibirsk recebemos 0700. A variável VALUES é, em vez disso, um vetor inteiro com pelo menos 8 elementos, fornece a maneira mais fácil de usar os resultados de DATEANDTIME nos cálculos de um programa. Se o sistema não incluir a data ou a hora em que você obtém o valor - HUGE (0). Esse é o número inteiro mais pequeno no modelo, como saída. O vetor incluirá os seguintes elementos: ano, mês, dia, diferença horária em minutos. Horas, minutos, segundos e milissegundos. Subrutina que retorna a hora do sistema. Pelo menos um argumento deve ser dado. COUNT é um número inteiro escalar que é aumentado em um para cada ciclo até COUNTMAX. Onde começa mais uma vez. Se não houver relógio do sistema, então - HUGE (0) é retornado. COUNTRATE é um número inteiro escalar que dá o número de ciclos por segundo. Se não houver relógio do sistema, o valor zero é 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 na posição FROMPOS e tem o comprimento LEN para direcionar TO a partir da posição TOPOS. Os bits restantes não são alterados. Todas as quantidades devem ser inteiras e todos, exceto TO, devem ter INTENÇÃO (IN) enquanto TO é suposto ter INTENT (INOUT) e ser do mesmo tipo tipo FROM 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 deve considerar o valor de BITSIZE. Uma sequência de números pseudo aleatórios pode ser gerada a partir de um valor inicial que é armazenado como um vetor inteiro. As sub-rotinas oferecem uma interface portátil para uma sequência de números aleatórios dependentes da implementação. Esta sub-rotina 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 sub-rotina redefine ou fornece informações sobre o gerador de números aleatórios. Nenhum argumento deve ser fornecido. A variável de saída SIZE deve ser um inteiro escalar e fornece 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 inicial presente. Exemplo: agora está disponível um exemplo simples sobre o uso dessas funções.
Comments
Post a Comment