Mais

Existe uma maneira de reduzir rapidamente a precisão em vários campos DOUBLE?

Existe uma maneira de reduzir rapidamente a precisão em vários campos DOUBLE?


Eu queria saber se existe uma maneira de reduzir a precisão para exibição de um campo DOUBLE de um número de campos, em um shapefile. Tenho 25 campos e gostaria de fazê-lo o mais automaticamente possível, mas não tenho certeza por onde começar. Particularmente, não quero criar novos campos e transferir os valores manualmente. Estou exibindo o texto usando texto dinâmico em páginas orientadas a dados. Eu só quero exibi-lo com duas em vez de 5-6 casas decimais.

Esta é a aparência da tabela de atributos, junto com a parte relevante do layout:

Aqui está a caixa de propriedades do campo:


Algumas maneiras de realizar esses tipos de tarefas.
1. Round ([myfield], 2) Isso funciona para calculadora de campo, rotulagem, etc.
2. na caixa de diálogo da camada, clique com o botão esquerdo do mouse na coluna do rótulo e selecione o formato dos rótulos
3. selecione o formato do número nas propriedades do campo e altere o número de decimais.



CORREÇÃO PARA RESPOSTA RUIM:

Basta clicar na guia circulada na minha tela de impressão.


Usei a opção arcpy.Calculatefield_managment em ARCPY para obter o mesmo resultado

import arcpy arcpy.env.overwriteOutput = True Workspace = 'N:  FGDB.gdb ' Feature = 'Featureclass' In_Feature = Workspace + Feature Field_round = 'Length_KM' Round_operator = 'round (! Length_KM!, 2)' imprimir Round_operator arcpy.CalculateField_management (In_Feature, Field_round, Round_operator, 'PYTHON', ")

Agricultura de Precisão (PA), também conhecida como Agricultura de Precisão ou Agricultura Inteligente, é um conceito de gestão agrícola relativamente recente baseado no uso de tecnologia da informação com o objetivo de obter maior eficiência produtiva, rentabilidade sustentável e produtos de melhor qualidade, minimizando os impactos ambientais . O PA utiliza uma combinação de avanços tecnológicos, como sensores de safra e solo, tecnologia de navegação e posicionamento por satélite, sensoriamento remoto, maquinário de aplicação de taxa variável e Internet das Coisas, entre outros. Por outro lado, a fim de tomar decisões de manejo de culturas específicas do local, PA usa métodos para processar e analisar dados para conhecer a magnitude e os padrões espaço-temporais da variabilidade da cultura. Tomar a decisão certa no momento certo para aplicar a quantidade certa de insumos é uma questão importante porque a produtividade, o benefício econômico e a sustentabilidade dependem do gerenciamento adequado da fazenda. A AF tem um grande potencial e pode dar uma contribuição significativa para a produção de alimentos, segurança e proteção, mas, embora as tecnologias de AF já estejam amplamente disponíveis, seu nível de implementação ainda é baixo. No entanto, práticas de trabalho influentes e novos modelos de negócios agrícolas estão em ascensão com a aplicação de conceitos de agricultura de precisão.

Esta edição especial pretende cobrir o estado da arte e os avanços recentes em diferentes aspectos relacionados à implementação real da Agricultura de Precisão em uma ampla gama de sistemas de cultivo (grãos, pastagens, culturas hortícolas, árvores frutíferas). Todos os tipos de manuscritos (pesquisas e revisões originais) que fornecem novos insights sobre a aplicação e os benefícios dos métodos e tecnologia de Agricultura de Precisão são bem-vindos. Os artigos podem incluir, mas não estão limitados aos seguintes tópicos:

  • Análise espacial e zoneamento de variabilidade dentro do campo e na fazenda
  • Sensoriamento proximal e remoto de solos e culturas
  • Amostragem e análise geoestatística
  • Redes de sensores sem fio, Internet das coisas, big data em PA
  • Tecnologias de taxa variável
  • Irrigação de precisão
  • Ag-engenharia e robótica
  • Proteção de colheita de precisão
  • Detecção e gerenciamento de nitrogênio
  • Modelos de safra e sistemas de apoio à decisão no PA
  • Implementação real e eficácia da PA (econômica e / ou ambiental)

Prof. Jos & eacute Antonio Mart & iacutenez-Casasnovas
Dr. Jaume Arn e oacute Satorra
Editores Convidados

Informações de envio do manuscrito

Os manuscritos devem ser submetidos online em www.mdpi.com, registrando-se e fazendo login neste site. Depois de registrado, clique aqui para acessar o formulário de inscrição. Os manuscritos podem ser submetidos até a data limite. Todos os artigos serão revisados ​​por pares. Os artigos aceitos serão publicados continuamente na revista (assim que forem aceitos) e serão listados juntos no site da edição especial. Artigos de pesquisa, artigos de revisão, bem como comunicações breves são convidados. Para trabalhos planejados, um título e um resumo curto (cerca de 100 palavras) podem ser enviados ao Escritório Editorial para divulgação neste site.

Os manuscritos enviados não devem ter sido publicados anteriormente, nem estar sob consideração para publicação em outro lugar (exceto artigos de anais de conferências). Todos os manuscritos são completamente avaliados por meio de um processo cego de revisão por pares. Um guia para autores e outras informações relevantes para a submissão de manuscritos estão disponíveis na página de Instruções para Autores. Agricultura é um jornal mensal internacional de acesso aberto revisado por pares, publicado pela MDPI.

Visite a página de Instruções para Autores antes de enviar um manuscrito. A Taxa de Processamento de Artigo (APC) para publicação nesta revista de acesso aberto é de 1600 CHF (Francos Suíços). Os artigos enviados devem ser bem formatados e usar um bom inglês. Os autores podem usar o serviço de edição em inglês da MDPI antes da publicação ou durante as revisões do autor.


7 Respostas 7

Por que DateTime.Now seria menos preciso do que a maioria dos clocks da CPU poderia suportar?

Um bom relógio deve ser ambos preciso e exato aqueles são diferentes. Como diz a velha piada, um relógio parado é exatamente preciso duas vezes por dia, um relógio com um minuto de atraso nunca é preciso em nenhum momento. Mas o relógio um minuto atrasado é sempre preciso para o minuto mais próximo, ao passo que um relógio parado não tem nenhuma precisão útil.

Por que DateTime deveria ser preciso para, digamos, um microssegundo quando não pode ser exato ao microssegundo? A maioria das pessoas não possui nenhuma fonte de sinais de hora oficiais com precisão de microssegundos. Portanto, dando seis dígitos após a casa decimal de precisão, os últimos cinco dos quais são lixo seria deitado.

Lembre-se, o objetivo do DateTime é representam uma data e hora. Timings de alta precisão não são de forma alguma o propósito de DateTime como você observou, esse é o propósito de StopWatch. O objetivo de DateTime é representar uma data e hora para fins como exibir a hora atual para o usuário, calcular o número de dias até a próxima terça-feira e assim por diante.

Em suma, "que horas são?" e "quanto tempo isso demorou?" são perguntas completamente diferentes, não use uma ferramenta projetada para responder uma pergunta para responder a outra.


11 maneiras de reduzir o consumo de energia de IA

Levar a IA ao limite requer novas arquiteturas, ferramentas e abordagens.

Conforme a indústria de aprendizado de máquina evolui, o foco se expandiu de simplesmente resolver o problema para resolver o problema melhor.

“Melhor” geralmente significa precisão ou velocidade, mas à medida que os orçamentos de energia do data center explodem e o aprendizado de máquina atinge o limite, o consumo de energia toma seu lugar ao lado da precisão e da velocidade como um problema crítico. Existem várias abordagens para as redes neurais que permitem reduções no consumo de energia.

“Todos estão procurando maneiras alternativas de implementar redes neurais que terão muito menos energia”, disse Elias Fallon, diretor do grupo de engenharia de software, grupo de IC & amp PCB personalizados da Cadence.

Outros concordam. “O próprio Google está preocupado com o poder durante a criação e o treinamento da rede neural”, disse Venki Venkatesh, diretor de R & ampD, soluções de AI & amp ML, grupo de design digital da Synopsys.

Cada decisão tomada sobre uma rede neural tem implicações para a energia. O próprio modelo afeta o poder, assim como a escolha do hardware de implementação. Embora desempenho e potência historicamente tenham se oposto, muitas das opções de baixo consumo de energia também podem aumentar a velocidade. É a precisão que pode sofrer mais com implementações de baixa energia.

Freqüentemente falamos sobre “consumo de energia” como se a energia fosse algo que pudesse ser consumido. Mas a potência é a taxa de consumo de energia. “A energia é muito importante para um fornecedor de silício que está fazendo essas coisas. Eles precisam projetar os trilhos de energia e as tensões corretamente ”, disse Suhas Mitra, diretor de marketing de produtos Tensilica AI da Cadence. “Mas o mais importante para a seleção de IP é menos energia.”

Dito de outra forma, se a limitação é o calor, então a energia é o mais importante. Se a limitação for a duração da bateria, o que importa é o consumo de energia, não a potência.

“A saturação de energia se transforma em saturação de energia, porque você não pode resfriar os chips quando eles estiverem acima de algumas centenas de watts”, disse Nick Harris, CEO da Lightmatter. “E então isso se transforma em‘ Não consigo & # 8217 usar os transistores para fazer trabalho computacional. ’”

Menos computação e menos dados significam menos consumo de energia. Isso leva a uma série de abordagens arquitetônicas e táticas específicas que reduzem o uso de energia. Além disso, menos movimentação de dados significa menor consumo de energia. Essas ideias podem operar independentemente ou ser empilhadas para maior economia.

1. Modelos menores. Todas as outras coisas sendo iguais, um modelo menor terá menos camadas com menos filtros e, portanto, exigirá menos computação e menos memória.

“Vimos uma diferença de ordem de magnitude na computação entre gráficos que funcionam nos mesmos conjuntos de dados”, disse Fergus Casey, diretor de pesquisa e desenvolvimento para processadores ARC na Synopsys. “Às vezes, os gráficos otimizados para requisitos de computação mais baixos nem mesmo degradam a precisão dos resultados.”

Infelizmente, simplesmente escolher uma rede menor para treinar pode não ser uma boa solução aqui. Em uma área onde a Navalha de Occam poderia ser aplicada com grande efeito, a tendência atual para modelos maiores aponta para o desafio. Se modelos menores sempre fossem suficientes, não haveria necessidade de modelos grandes. E ainda assim eles continuam crescendo.

Isso é impulsionado pela necessidade de maior precisão e tomadas de decisão mais sofisticadas. Fazer um trabalho melhor em uma variedade mais ampla de amostras de treinamento pode exigir modelos maiores. Lidar com mais nuances dentro de um campo de amostras (distinguir um cão com aparência de gato de um gato com aparência de cachorro) também pode exigir mais peso.

Como veremos, existem ideias que tornam um modelo menor em uma base tática, mas se o MobileNet fosse suficiente para tudo, então não precisaríamos do YOLO. Em vez disso, os modelos menores são escolhidos quando a plataforma de computação e a fonte de energia assim o exigem, com a precisão como uma compensação potencial.

2. Movendo menos dados. Esta é provavelmente a mais visível das mitigações de energia, dado o reconhecimento generalizado dos efeitos de atingir a parede da memória. As soluções aqui são de natureza altamente arquitetônica.

Embora a abordagem anterior sugerisse reduzir os dados, a parede da memória tem menos a ver com reduzir os dados do que com movê-los menos e em distâncias mais curtas. Para uma determinada quantidade de dados, a arquitetura pode ser um fator determinante.

O pior cenário seria uma única CPU processando uma rede inteira. Para cada cálculo, os dados devem ser buscados, operados e armazenados novamente para uso posterior. As instruções também devem ser buscadas e decodificadas para um determinado conjunto de operandos. A sobrecarga domina, prejudicando a potência e o desempenho.

Na outra extremidade do espectro estão as arquiteturas em que os pesos permanecem residentes e as ativações avançam gradativamente dentro de um chip. Ao tornar o chip grande o suficiente para conter um modelo inteiro, os pesos podem ser carregados uma vez e deixados no lugar. Ao localizar pequenos pedaços de SRAM na saída de cada estágio do filtro, as ativações podem fluir para células próximas para computação posterior, em vez de ter que voltar até a DRAM e ser trazidas novamente mais tarde.

Manter os pesos fixos é apenas uma opção, no entanto. “Estacionário de peso pode ser mais eficiente para convoluções tradicionais, mas camadas totalmente conectadas sem lote serão mais eficientes no modo estacionário de entrada ou de saída estacionário”, disse Casey. O último se refere à geração de um único resultado quase final, em vez de armazenar e, posteriormente, combinar uma série de resultados parciais.

Esta é uma área onde a distinção entre energia e energia consumida pode diferir amplamente. Em teoria, se a computação for canalizada por meio de um único núcleo que consome x energia, então a energia consumida para y computações será x vezes y.

Se uma matriz do mesmo núcleo foi construída com núcleos suficientes para lidar com todos os cálculos em paralelo, então você tem y núcleos fazendo 1 cálculo em vez de 1 núcleo fazendo y cálculos. A energia consumida deveria ser a mesma, mas o fato da versão paralela consumir a energia em um período de tempo muito menor dá a ela uma potência muito maior.

Outra maneira de aumentar a localidade é fazer o máximo de computação o mais próximo possível da fonte de dados. Andy Heinig, líder do grupo para integração de sistemas avançados e chefe do departamento de eletrônica eficiente da Fraunhofer IIS & # 8217 Engineering of Adaptive Systems Division, ilustrou isso com um exemplo de fusão de sensores. “Para tarefas diferentes, é muito importante dividir o processamento de dados entre lugares diferentes”, disse ele. “A primeira etapa de processamento deve ocorrer diretamente no sensor e o processamento posterior em um nó de extremidade, que resume as informações de diferentes sensores”.

Em uma aplicação como um automóvel, os sensores são amplamente distribuídos, então pode ser necessário haver algum locus central de computação para dobrar todos os sensores. “Algumas decisões podem ser feitas apenas no processador centralizado, porque apenas há todas as informações do todos os sensores disponíveis ”, acrescentou Heinig. Minimizar essa computação central significa menos dados sendo alimentados de lugares distantes do veículo.

Em geral, um compilador eficaz pode otimizar a movimentação de dados por meio do uso cuidadoso de caches, FIFOs e / ou operações DMA.

Todas as outras coisas sendo iguais, esta escolha arquitetônica não deve afetar a precisão.

3. Menos computação - quando possível. Para um determinado modelo, pode haver maneiras de calcular um resultado com menos operações. Um exemplo popular de convolução é a abordagem Winograd.

“Usar uma transformação Winograd de convoluções pode reduzir significativamente o número de cálculos necessários para uma grande operação de tensor, reduzindo significativamente a potência no processo”, disse Steve Roddy, vice-presidente de marketing de produto do grupo de aprendizado de máquina da Arm.

A escala de uma abordagem direta para multiplicações de matrizes convolucionais é da ordem de n 3, enquanto Winograd a reduz para n 2. Em particular, reduz o número de cálculos “fortes” (multiplicações) às custas de cálculos adicionais “fracos” (adições).

A escolha da função de ativação também pode ser importante. “Um modelo pequeno que depende do tanh como uma função de ativação pode ser menos eficiente do que um modelo ligeiramente maior usando ReLU simples”, observou Casey.

A escolha do modelo de execução também pode ser importante. Usar uma abordagem interpretada como TensorFlow Lite ou algum outro equivalente pode consumir mais energia do que um modelo que foi compilado diretamente para o hardware subjacente.

4. O batch ajuda - sempre que possível. Para alguns aplicativos, como o processamento de uma coleção de imagens ou quadros estáticos, pode-se obter maior eficiência com o aumento do tamanho do lote. Isso significa que uma determinada configuração dos recursos de processamento - código do kernel e pesos - pode ser amortizada em mais amostras, resultando em menos buscas de dados e instruções.

Mas isso só funciona para alguns aplicativos. E isso normalmente se aplica apenas a implementações de data center, onde uma operação está sendo executada em uma grande coleção de amostras que já estão residentes.

Os aplicativos de borda normalmente recebem um único pacote de dados por vez. Por definição, eles devem completar o processamento de um único pacote antes de iniciar o próximo. Portanto, essa técnica não se aplica bem a algumas das implementações que mais poderiam usá-la - pequenos dispositivos de borda alimentados por bateria.

Os lotes também não afetam a precisão. Os resultados obtidos simultaneamente com um grande lote de dados não devem ser diferentes do mesmo processamento feito com uma amostra completa de cada vez.

5. Os formatos de dados são importantes. A maior precisão será obtida usando os números mais precisos nos cálculos. É por isso que o treinamento normalmente envolve números de ponto flutuante.

Mas os circuitos de ponto flutuante usam mais energia do que os circuitos inteiros. E inteiros expressos com mais bits usam mais energia do que inteiros com larguras de bits menores.

Quantizar em números inteiros é comum, embora não seja universal. Onde isso é feito, muitas empresas parecem estar optando por números inteiros de 8 bits. Mas os pesquisadores também estão procurando números inteiros menores - 4 bits, 2 bits e até 1 bit. Isso significa menos armazenamento e movimentação de dados.

O limite é a implementação de bit único, que dá origem às chamadas “redes neurais binárias” ou BNNs. “Isso não apenas reduz a quantidade de computação e a quantidade de memória, mas você pode realmente se livrar do circuito de multiplicação inteiramente”, disse Linley Gwennap, presidente e analista principal do The Linley Group, na conferência Linley Spring 2021. “Quando você tem apenas um bit sendo multiplicado por um bit, é uma porta lógica XNOR que executa a função. Portanto, é uma grande economia de computação e energia. ”

A compensação aqui é a precisão. “À medida que você faz essas compensações, você vai do ponto flutuante para uma versão quantizada e desce para a precisão de bit inferior”, disse Mitra. “O fantástico é que todas essas coisas são possíveis. A parte que as pessoas esquecem é que nada vem de graça. ”

Os modelos podem precisar de retreinamento após a quantização para trazer a precisão de volta. O treinamento com reconhecimento de quantização pode ajudar incorporando a largura de bit desejada ao treinamento original, potencialmente evitando a necessidade de uma etapa de retreinamento posterior.

A precisão também pode ser ajustada permitindo que diferentes camadas tenham diferentes precisões. As estruturas de treinamento suportam isso, equilibrando a necessidade de baixa energia e maior precisão.

Algumas empresas se esforçaram muito para encontrar maneiras de reduzir o tamanho dos dados sem prejudicar a precisão. “A IBM é capaz de atingir a mesma precisão, de INT8 a INT4, o que é bastante impressionante”, disse Gwennap. “Mesmo usando números inteiros de 2 bits, a precisão está dentro de um por cento ou dois.”

Existe um possível efeito colateral de reduzir o tamanho dos dados se a precisão deve ser mantida. “Freqüentemente, o tamanho das redes aumenta com tipos de dados menores”, disse Heinig. “Definitivamente, há um ponto ideal. Mas o ponto ideal pode ser específico do aplicativo. ”

6. A escassez pode ajudar. Os cálculos da rede neural envolvem matemática vetorial e matricial.Em teoria, a quantidade de computação é determinada apenas pelos tamanhos da matriz. Mas entradas de valor 0 criam um resultado de multiplicação zero que é conhecido a priori. Não há necessidade de executar o cálculo. Portanto, quanto mais entradas de vetor ou matriz forem 0, menos computação verdadeira será necessária.

Em princípio, é possível que um modelo bruto seja naturalmente mais esparso do que outro modelo. Nesse caso, não há compensação envolvida em tirar proveito dessa dispersão. Mas geralmente, em vez de matrizes ou vetores serem realmente esparsos, eles podem ter entradas que são números muito pequenos. O pensamento é que essas entradas têm um impacto insignificante no resultado geral e, portanto, os pequenos números podem ser alterados para 0 para aumentar a dispersão.

Isso pode ser feito durante o desenvolvimento do modelo, podando pesos que são muito pequenos, resultando em matrizes de peso mais esparsas. Também pode ser feito para ativações em tempo real, dependendo das funções de ativação escolhidas, levando a vetores de ativação mais esparsos.

A Nvidia tem uma versão dinâmica disso envolvendo mascarar pesos de valor zero. Isso adiciona complexidade ao circuito, ao mesmo tempo que aumenta a dispersão em um grau maior do que outras abordagens.

Fig. 1: O esquema da Nvidia pode alavancar a dispersão em diferentes posições, agrupando os valores diferentes de zero e usando uma máscara para garantir que os valores sejam multiplicados pelos valores de ativação apropriados. Fonte: The Linley Group

A compensação novamente é a precisão. Quando um determinado peso, por exemplo, é podado, presume-se que isso não faria uma diferença significativa no resultado. E isso pode ser verdade - para aquele peso. Mas se um grande número de pesos for removido, o resultado cumulativo pode ser uma precisão inferior.

Da mesma forma, uma determinada ativação pode não ser muito afetada pela introdução de esparsidade. Mas se isso acontecer em todas as camadas, os erros podem se acumular, prejudicando a precisão.

7. Use compressão. Para um determinado nível de dispersão, a compactação pode ajudar a reduzir a quantidade de dados que estão sendo movidos. No momento do projeto, os pesos podem ser comprimidos às custas do hardware de descompressão. Em tempo de execução, as entradas ou ativações podem ser compactadas às custas do hardware de compactação e descompactação.

“O custo de energia da descompressão é muito menor do que você gastaria para buscar os bits extras”, observou Ashutosh Pandey, membro sênior da equipe técnica e engenheiro de sistemas da Infineon.

Esta compressão, presumindo que não haja perdas, não deve ter impacto na precisão.

8. Foco em eventos. O vídeo consiste em uma série de imagens em sequência. Cada quadro será diferente do anterior - às vezes muito, mas com mais freqüência sutilmente. Um único objeto pode se mover no quadro, por exemplo, enquanto o fundo permanece estacionário.

As abordagens tradicionais reprocessam essas informações estacionárias em cada quadro. Com o tempo, é muito processamento redundante. Uma alternativa é focar a computação apenas no que está mudando no fluxo. Isso normalmente é muito menos pixels do que o quadro completo, permitindo menos computação e menos memória.

Isso pode ser feito usando uma arquitetura de rede neural padrão, mas com foco apenas na mudança. Para o primeiro quadro, todo o quadro deve ser processado. Para quadros sucessivos, um “diff” pode ser feito entre os quadros atual e anterior, direcionando o trabalho apenas para as partes que mudaram.

Essas mudanças são categorizadas como “eventos” e esse tipo de arquitetura é uma abordagem “baseada em eventos”. GrAI Matter é um exemplo de empresa que possui uma rede mais ou menos convencional, mas que trabalha no domínio de eventos.

Outra implementação dessa ideia é uma rede neural de spiking, ou SNN. SNNs são considerados neuromórficos e não têm a mesma estrutura que as redes neurais artificiais mais convencionais (ANNs). O projeto Loihi da Intel é uma tentativa massiva de encurralar os SNNs. BrainChip tem uma oferta comercial mais modesta.

Fig. 2: As redes neurais de spiking imitam o cérebro, reduzindo a potência ao se concentrar nos eventos. Fonte: The Linley Group

Não está claro se o uso de uma abordagem baseada em eventos teria um impacto específico na precisão.

Casey observou um desafio com arquiteturas baseadas em eventos: devido à falta de sincronia, “um SNN totalmente orientado a eventos não será capaz de explorar qualquer vetorização”. Isso pode resultar em cálculos menos eficientes - o que poderia devolver parte da energia economizada.

9. Usando circuitos analógicos. As implementações analógicas podem consumir menos energia do que as versões digitais - particularmente quando o cálculo é feito em um sinal analógico. Converter o analógico em digital pode consumir muita energia, portanto, permanecer no domínio analógico, se possível, economiza essa energia. “Você pode reduzir a potência em 10X, 20X ou mais usando computação analógica”, observou Gwennap.

Isso pode ser particularmente eficaz se o fluxo do sensor de entrada tiver um baixo nível de dados relevantes. A energia é economizada ao não converter os dados irrelevantes em digital para análise. A Aspinity é um exemplo de empresa que segue este caminho.

A computação em memória (IMC) também aproveita o analógico, mas apresenta ilhas analógicas em um chip digital. Os dados digitais devem ser convertidos com precisão para analógico para fins de computação e, em seguida, o resultado deve ser convertido de volta para digital com precisão, reduzindo a economia geral de energia. Mas a alegação é que a economia de energia no domínio analógico ainda torna isso uma vitória de energia líquida. A Mythic é um exemplo de empresa que usa essa técnica.

O IMC pode reduzir a energia de duas maneiras. “Não precisar buscar dados da memória é um fator opressor”, disse Ramesh Chettuvetty, diretor sênior de engenharia de aplicativos e marketing de produto, soluções de memória, para a linha de produtos RAM da Infineon & # 8217s. “Mas a outra coisa é que o IMC melhora enormemente o paralelismo de computação.”

Fig. 3: A computação na memória transforma operações de multiplicação-adição em um exercício da Lei de Ohm por meio de uma matriz de memória. Os pesos permanecem residentes como os valores de condutância na matriz. Fonte: The Linley Group

Há realmente um impedimento principal para usar analógico em mais lugares, como Heinig observou: “As técnicas analógicas são muito mais complexas na implementação”.

10. Usando fótons em vez de elétrons. Enquanto os desenvolvedores tradicionais lutam com a Lei de Moore para aumentar a computação eletrônica que pode ser feita em um pedaço de silício, muito poucas empresas estão se voltando para a fotônica de silício. Isso pode reduzir o consumo de energia porque o próprio computador não consome energia.

Toda a energia usada para computação fotônica vem do laser. Essa energia será dividida e recombinada de diferentes maneiras na fase de computação e alguma energia será perdida nos guias de ondas. Mas, fundamentalmente, o laser é o único consumidor de energia externa. Todos os demais circuitos meramente dissipam essa energia, deixando o suficiente no sinal de saída para ser útil.

Isso valoriza a criação de uma plataforma fotônica eficiente com guias de onda de baixa perda. Mas há um limite para o quão exótica a plataforma pode ser, porque os chips fotônicos práticos de hoje precisarão ser compatíveis com CMOS para que as eficiências das fábricas possam ser aproveitadas para custos mais baixos (quer os circuitos CMOS co-residam ou não com os fotônicos em um único chip )

Fig. 4: Os “circuitos” fotônicos não usam energia para as funções de computação. Toda a energia é introduzida por meio dos lasers. Fonte: The Linley Group

11. Otimize seu hardware - e software. Ajustar uma implementação aos recursos do hardware de computação subjacente também reduzirá o consumo de energia. Isso pode significar a arquitetura de nível superior ou os detalhes de nível inferior. “Se você pode adaptar seu pipeline à sua aplicação, essa é uma maneira de economizar energia”, disse Pandey.

Quanto mais cedo isso for feito, melhor. “Talvez a maior vantagem venha de adaptar a rede para o hardware de destino, e fazer isso no momento do desenvolvimento do modelo”, disse Roddy. “Há uma grande variedade de técnicas disponíveis hoje nas estruturas de treinamento que enfatizam a implantação de inferência em dispositivos.”

Em alguns casos, você pode treinar o modelo primeiro, usando um corte bruto apenas para fazer algo funcionar o mais rápido possível. Assim que o hardware for decidido, o retreinamento para esse hardware ou a compilação específica para esse hardware resultará em uma implementação mais eficiente.

Embora muito foco esteja nas arquiteturas de hardware, quase sempre há algum componente de software em execução também. Como isso é otimizado - como os loops são aninhados, por exemplo - pode afetar o consumo de energia.

Conclusão
Com circuitos tradicionais, normalmente entende-se que, para tornar as coisas mais rápidas, você precisa usar mais energia. Velocidade e potência são combatentes sem fim neste jogo. Mas, no caso de reduzir o consumo de energia de IA, muitas das técnicas também contribuem para um melhor desempenho.

Por exemplo, ao manter os dados locais ou estacionários, você economiza energia sem sofrer os adicionadores de latência das buscas de dados. A dispersão reduz a quantidade de computação, o que significa que você termina mais rápido.

O exemplo final é a fotônica. Os cálculos serão possíveis com latência de nível de picossegundo e altos níveis de paralelismo podem ser implementados usando multiplexação por divisão de onda, completando múltiplos fluxos de computação em paralelo naquele período de tempo de nível de picossegundo.

No entanto, este não é um almoço grátis. Onde o poder e o desempenho não lutam, as compensações provavelmente serão o custo e / ou a precisão. Pode-se muito bem estar trocando a área de silício pelos benefícios de potência e velocidade. Dito isso, o dinheiro gasto em silício pode se pagar com contas de energia mais baixas.


Experiências da Suécia

O desenvolvimento tecnológico em PA tem sido rápido desde os anos 90, enquanto uma ampla implementação e uso prático da tecnologia tem sido muito mais lento. Muitos agricultores compram novas máquinas com funções incorporadas para medidas variáveis ​​e tecnologia de PA, sem realmente usá-las. Isso pode ser ilustrado pela seguinte citação de um dos fazendeiros envolvidos em um projeto em andamento relacionado ao PDV: “Essa é a situação hoje em dia ... você tem muita tecnologia, mas não a usa ... também é uma questão de interesse ou conhecimento ... muitas vezes há muita tecnologia em uma máquina que você não precisa ... e muita gente não usa ... longe disso ”. No final da década de 1990, o sensor N da Yara foi introduzido no mercado sueco. Inicialmente, poucos agricultores, alguns trabalhando como subcontratados, abraçaram a tecnologia do sensor N, enquanto a maioria dos agricultores, conselheiros e autoridades permaneceram bastante passivos, apesar da promoção contínua da tecnologia na imprensa agrícola, exposições e fabricantes. Ele teve o suporte dos fabricantes e distribuidores, mas houve poucos experimentos de campo para garantir a confiabilidade sobre o benefício da tecnologia do sensor N desde o início. Ainda assim, o sensor N da Yara é um aparelho difícil de avaliar totalmente em campos individuais sem experimentos de campo. No entanto, em 2015, a maioria dos agricultores suecos ouviu falar do sensor N da Yara e, durante a temporada de 2015, estimou-se que aproximadamente 130 sensores N da Yara estão em uso prático nas fazendas suecas. A condição de cultivo foi muito favorável para cereais em 2015 com alto potencial de rendimento e uma alta demanda de nitrogênio para garantir a qualidade do cozimento (ou seja, teor de proteína). Muitos fazendeiros e consultores não perceberam esse aumento na demanda N até depois da colheita! No entanto, os campos fertilizados com VRA com base no sensor N apresentaram maior teor de N tanto no trigo para moagem quanto na cevada para malte (com. Pessoal K Nissen Yara AB Suécia). O moinho de farinha sueco dominante afirma que o VRA de fertilizantes é uma necessidade para a produção de trigo com a qualidade certa para a farinha (http://www.kungsornen.se/).

O sensor Yara N detecta o status do nitrogênio e da biomassa das plantas medindo a refletância do dossel em partes do espectro eletromagnético do infravermelho próximo e vermelho (Link et al. 2002). A informação espectral obtida é combinada com um algoritmo de fertilização que permite a fertilização com nitrogênio específico do local dentro de um campo. Lammel et al. (2001) apontam que o sensor N da Yara é valioso para evitar fertilização excessiva e insuficiente dentro de um campo, resultando em aumento da produtividade, diminuição do acamamento e maturação mais homogênea. Outros pesquisadores acentuam que o uso do sensor N resultou apenas em pequenas diferenças no rendimento (Berntsen e Thomsen et al. 2006 Jørgensen et al. 2006) e Zillmann et al. (2006) apontam que a tecnologia do sensor N funciona quando o nitrogênio é o principal fator limitante do crescimento. O uso do sensor Yara N reduz a lixiviação de nitrogênio se as áreas com requisitos mais baixos de fertilização com nitrogênio no campo puderem ser identificadas (Delin e Stenberg 2014). Assim, a tecnologia do sensor N pode trazer benefícios para os agricultores e também para uma sociedade mais sustentável no longo prazo. Foi reconhecido pelas partes interessadas na comunidade agrícola sueca que os produtores onde a qualidade da colheita e o pagamento estão fortemente ligados ao teor de nitrogênio, como cevada para malte e trigo para pão, ou onde a capacidade de mineralização do solo varia muito, por exemplo, devido ao alto fornecimento ou variação de estrume no tipo de solo, têm o benefício potencial mais importante da tecnologia de N-sensor.

De um modo geral, a maioria dos agricultores percebe que o rendimento varia dentro de um campo, assim como a amplitude da variação pode variar muito entre os diferentes campos. Em teoria, os agricultores não deveriam ter problemas para entender a utilidade do sensor N da Yara. No entanto, muitos agricultores não usam a aplicação de nitrogênio variável. Os motivos podem ser custos mais elevados, trabalho extra, dúvidas de credibilidade ou custo-benefício. Na verdade, nem mesmo em safras especiais, por exemplo na batata, onde uma fertilização variada demonstrou fornecer um valor agregado direto devido a uma melhor qualidade, a tecnologia foi adaptada de forma mais ampla.

No início de 2000, diferentes sistemas de direção assistida, como a direção automática, foram introduzidos no mercado sueco. Os sistemas de TIC, como direção automática ou sistemas de orientação, têm como objetivo diminuir as sobreposições, as horas de trabalho, reduzir o consumo de energia e facilitar novos conceitos agrícolas, como o tráfego controlado. Pelo menos algumas das vantagens descritas são fáceis de entender e se tornam óbvias apenas ao observar o uso da tecnologia em ação, ou seja, fornecem feedback visual momentâneo nos campos. O interesse dos agricultores tem sido abrangente desde o início e essas tecnologias de PA alcançaram alta popularidade diretamente após serem lançadas. A experiência da implementação dessas aplicações de PA diretas é compartilhada na Alemanha (Busse et al. 2014), bem como na Europa Central e do Norte, nos EUA e na Austrália (EIP-Agri Focus group report 2015). É importante ressaltar que, em comparação com o sensor N da Yara, o uso de um sistema de direção também requer novos conhecimentos tecnológicos por parte do agricultor, mas os dois sistemas exigem tipos ligeiramente diferentes de suporte à tomada de decisão. O Yara N-Sensor requer a entrada de dados de rendimento esperado e necessidade de fertilizante no local de referência, enquanto o sistema de direção requer apenas a tomada de uma decisão operacional sobre a distância para a próxima pista. Um sistema de direção em um trator ou colheitadeira tem alguns benefícios pedagógicos óbvios em comparação com o sensor N da Yara ao fornecer uma compreensão das consequências ambientais e econômicas das ações realizadas, os efeitos imediatos que podem ser experimentados ao dirigir o trator no campo . O desempenho de linhas retas e a prevenção de corridas duplas ou linhas ausentes são resultados óbvios e imediatos para o agricultor. Os sentidos imediatos do fazendeiro das vantagens obtidas do sensor N em comparação com as tecnologias de direção assistida, portanto, diferem. Payne et al. (2016) descreveram nove estratégias de extensão para adoção de tecnologia dependente do tipo de tecnologia que seria adotada, desde o impulso de tecnologia até estratégias de co-desenvolvimento. As tecnologias que se encaixam na estratégia de push de tecnologia são caracterizadas por questões não complexas, impactos observáveis, alta compatibilidade e fácil de implementar, enquanto tecnologias mais complexas sem benefícios imediatamente observáveis ​​e dificuldades em testes e implementação precisam de estratégias de co-desenvolvimento para ser adoptadas. Esta é provavelmente uma explicação central para as diferenças entre a adoção de sistemas de direção automática em comparação com o sensor N da Yara.

Uma alternativa para otimizar o uso do nitrogênio é o AgriDSS denominado CropSAT (http://www.cropsat.se/), desenvolvido pela POS durante os anos 2013–2014. O CropSAT usa imagens de satélite para o cálculo de um índice de vegetação (Qi et al. 1994) para o cálculo de arquivos VRA para fertilização com nitrogênio em cereais. O índice de vegetação no CropSAT está correlacionado às medições feitas com o sensor Yara N (Söderström et al. 2015). Para utilizar o CropSAT, o usuário inicia o aplicativo na internet, marca um campo no aplicativo Google Earth e o índice de vegetação de uma imagem de satélite escolhida é calculado e mostrado no campo marcado no Google Earth. Para obter um arquivo VRA, o usuário deve decidir sobre cinco níveis de quantidade de nitrogênio relacionados ao índice de vegetação (ver Fig. 1). Quando os cinco níveis são definidos, um arquivo VRA para o campo real pode ser calculado (ver Fig. 2) e transferido para um propagador por um stick de memória USB. A recomendação é que o usuário vá a campo e verifique os níveis de nitrogênio por meio de medições do estado N absoluto com o chamado Spadmeter (https://www.konicaminolta.eu/en/measuring-instruments/products/colour- medição / medidor de clorofila / spad-502plus / introdução.html) ou apenas verificando a necessidade de N adicional com sua própria experiência e conhecimento sobre verdura e status de N do dossel. Durante 2015, um protótipo de alta fidelidade do CropSAT estava disponível na internet, de uso gratuito devido ao financiamento do Conselho de Agricultura da Suécia. Agricultores e consultores mostraram um interesse considerável no CropSAT. O CropSAT pode ser visto como uma alternativa ao N-sensor, mas com resolução inferior. O CropSAT permite a observação direta da variação dentro do campo no status do dossel, o que parece muito interessante para os agricultores que participam do projeto em andamento relacionado ao POS. Até agora, no entanto, os agricultores indicaram que o procedimento / processo de definir os cinco níveis de nitrogênio parece ser mais complicado do que o esperado e precisa ser mais estudado.

Variação no índice de vegetação calculado pelo AgriDSS CropSAT (http://www.cropsat.se) a partir de uma imagem de satélite e visualizada em um campo escolhido no Google Earth. Cinco níveis de aplicação de nitrogênio são definidos e podem ser usados ​​como base para cálculos de um VRA

O arquivo VRA aplicado a um mapa do Google Earth, pronto para ser salvo em um pen drive USB e transferido para o spreader

As tecnologias de PA acima descritas tiveram impactos diferentes no mercado sueco.O Yara N-sensor foi lançado na década de 90, representou um investimento para o usuário em aprendizado e custo resultando em um novo tipo de equipamento de apoio à tomada de decisão para governar a fertilização. Os sistemas de direção foram lançados no mercado sueco no início de 2000 e foram amplamente adaptados rapidamente. Isso provavelmente se deveu às vantagens óbvias nas reduções de custos, bem como à instrução produzida de forma fácil e momentânea para VRA de N. Deve-se enfatizar que é muito cedo para avaliar a resposta de penetração no mercado da tecnologia CropSAT. O fato de que um número significativo de agricultores já possui a tecnologia necessária para usar a tecnologia CropSAT, é gratuita e gratuita para uso, financiada e paga pela Greppa Näringen (um serviço de consultoria financiado pelo governo sueco e pela UE através do Conselho Sueco da Agricultura) podem ser aspectos importantes para a sua disponibilidade e impacto. Esperançosamente, isso pode contribuir para reduzir as barreiras de entrada para VRA de N e ter um impacto positivo no uso da tecnologia de PA pelos agricultores suecos. De grande importância para o impacto futuro é se é ou não percebido como credível e útil para o impacto das práticas de trabalho dos agricultores é se é ou não percebido como credível e útil para as práticas de trabalho dos agricultores e em comparação com o Yara N- sensor, e em que medida o sistema CropSAT é considerado sustentável por meio do design continua a ser avaliado.


Existe uma maneira de reduzir rapidamente a precisão em vários campos DOUBLE? - Sistemas de Informação Geográfica

Cada valor manipulado pelo banco de dados Oracle possui um tipo de dados. O tipo de dados de um valor associa um conjunto fixo de propriedades ao valor. Essas propriedades fazem com que o Oracle trate os valores de um tipo de dados de maneira diferente dos valores de outro. Por exemplo, você pode adicionar valores do tipo de dados NUMBER, mas não valores do tipo de dados RAW.

Ao criar uma tabela ou cluster, você deve especificar um tipo de dados para cada uma de suas colunas. Ao criar um procedimento ou função armazenada, você deve especificar um tipo de dados para cada um de seus argumentos. Esses tipos de dados definem o domínio de valores que cada coluna pode conter ou que cada argumento pode ter. Por exemplo, as colunas DATE não podem aceitar o valor 29 de fevereiro (exceto para um ano bissexto) ou os valores 2 ou 'SAPATOS'. Cada valor subsequentemente colocado em uma coluna assume o tipo de dados da coluna. Por exemplo, se você inserir '01 -JAN-98 'em uma coluna DATE, o Oracle tratará a sequência de caracteres '01 -JAN-98' como um valor DATE após verificar se ela se traduz em uma data válida.

O banco de dados Oracle fornece vários tipos de dados integrados, bem como várias categorias para tipos definidos pelo usuário que podem ser usados ​​como tipos de dados. A sintaxe dos tipos de dados Oracle aparece nos diagramas a seguir. O texto desta seção está dividido nas seguintes seções:

Um tipo de dados é escalar ou não escalar. Um tipo escalar contém um valor atômico, enquanto um não-escalar (às vezes chamado de "coleção") contém um conjunto de valores. Um objeto grande (LOB) é uma forma especial de tipo de dados escalar que representa um grande valor escalar de dados binários ou de caracteres. Os LOBs estão sujeitos a algumas restrições que não afetam outros tipos escalares devido ao seu tamanho. Essas restrições são documentadas no contexto da sintaxe SQL relevante.

Os pré-compiladores Oracle reconhecem outros tipos de dados em programas SQL embutidos. Esses tipos de dados são chamados de tipos de dados externos e estão associados a variáveis ​​de host. Não confunda tipos de dados internos e tipos definidos pelo usuário com tipos de dados externos. Para obter informações sobre tipos de dados externos, incluindo como o Oracle converte entre eles e tipos de dados integrados ou tipos definidos pelo usuário, consulte o Guia do Programador Pro * COBOL e o Guia do Programador Pro * C / C ++.

Os tipos de dados integrados do Oracle aparecem nas figuras a seguir. Para obter descrições, consulte Tipos de dados internos do Oracle.

Os tipos de dados com suporte ANSI aparecem na figura a seguir. ANSI, DB2 e tipos de dados SQL / DS discutem o mapeamento de tipos de dados com suporte ANSI para tipos de dados integrados do Oracle.

Para obter descrições de tipos definidos pelo usuário, consulte Tipos definidos pelo usuário.

Os tipos de dados fornecidos pela Oracle aparecem nas figuras a seguir. Para obter descrições, consulte os Tipos fornecidos pela Oracle.

Para descrições dos tipos Any, consulte Any Types.

Para obter descrições dos tipos XML, consulte Tipos XML.

Para obter descrições dos tipos espaciais, consulte Tipos espaciais.

Tipos de dados integrados da Oracle

A tabela Resumo do tipo de dados integrado lista os tipos de dados integrados disponíveis. O banco de dados Oracle usa um código para identificar o tipo de dados internamente. Este é o número na coluna Código da tabela Resumo de tipo de dados integrado. Você pode verificar os códigos na tabela usando a função DUMP.

Além dos tipos de dados integrados listados na tabela Resumo do tipo de dados integrados, o banco de dados Oracle usa muitos tipos de dados internamente que são visíveis por meio da função DUMP.

Tabela 2-1 Resumo do tipo de dados integrado

VARCHAR2 (tamanho [BYTE | CHAR])

Cadeia de caracteres de comprimento variável com bytes ou caracteres de tamanho máximo. Você deve especificar o tamanho para VARCHAR2. O tamanho mínimo é 1 byte ou 1 caractere. O tamanho máximo é:

32.767 bytes ou caracteres se MAX_STRING_SIZE = EXTENDED

4000 bytes ou caracteres se MAX_STRING_SIZE = STANDARD

Consulte Tipos de dados estendidos para obter mais informações sobre o parâmetro de inicialização MAX_STRING_SIZE.

BYTE indica que a coluna terá semântica de comprimento de byte. CHAR indica que a coluna terá semântica de caracteres.

Cadeia de caracteres Unicode de comprimento variável com caracteres de tamanho máximo. Você deve especificar o tamanho para NVARCHAR2. O número de bytes pode ser até duas vezes o tamanho para a codificação AL16UTF16 e três vezes o tamanho para a codificação UTF8. O tamanho máximo é determinado pela definição do conjunto de caracteres nacional, com um limite superior de:

32.767 bytes se MAX_STRING_SIZE = EXTENDED

4000 bytes se MAX_STRING_SIZE = STANDARD

Consulte Tipos de dados estendidos para obter mais informações sobre o parâmetro de inicialização MAX_STRING_SIZE.

Número com precisão pe escala s. A precisão p pode variar de 1 a 38. A escala s pode variar de -84 a 127. Tanto a precisão quanto a escala estão em dígitos decimais. Um valor NUMBER requer de 1 a 22 bytes.

Um subtipo do tipo de dados NUMBER com precisão p. Um valor FLOAT é representado internamente como NUMBER. A precisão p pode variar de 1 a 126 dígitos binários. Um valor FLOAT requer de 1 a 22 bytes.

Dados de caracteres de comprimento variável de até 2 gigabytes ou 2 31 -1 bytes. Fornecido para compatibilidade com versões anteriores.

A data válida vai de 1º de janeiro de 4712 AC a 31 de dezembro de 9999 DC. O formato padrão é determinado explicitamente pelo parâmetro NLS_DATE_FORMAT ou implicitamente pelo parâmetro NLS_TERRITORY. O tamanho é fixado em 7 bytes. Este tipo de dados contém os campos de data e hora YEAR, MONTH, DAY, HOUR, MINUTE e SECOND. Não tem segundos fracionários ou fuso horário.

Número de ponto flutuante de 32 bits. Este tipo de dados requer 4 bytes.

Número de ponto flutuante de 64 bits. Este tipo de dados requer 8 bytes.

Valores de ano, mês e dia de data, bem como valores de hora, minuto e segundo de tempo, onde fractional_seconds_precision é o número de dígitos na parte fracionária do SEGUNDO campo de data e hora. Os valores aceitos de fractional_seconds_precision são de 0 a 9. O padrão é 6. O formato padrão é determinado explicitamente pelo parâmetro NLS_TIMESTAMP_FORMAT ou implicitamente pelo parâmetro NLS_TERRITORY. O tamanho é 7 ou 11 bytes, dependendo da precisão. Este tipo de dados contém os campos de data e hora YEAR, MONTH, DAY, HOUR, MINUTE e SECOND. Ele contém segundos fracionários, mas não tem fuso horário.

TIMESTAMP [(fractional_seconds_precision)] COM FUSO HORÁRIO

Todos os valores de TIMESTAMP, bem como o valor de deslocamento do fuso horário, em que fractional_seconds_precision é o número de dígitos na parte fracionária do SEGUNDO campo de data e hora. Os valores aceitos são de 0 a 9. O padrão é 6. O formato de data padrão para o tipo de dados TIMESTAMP WITH TIME ZONE é determinado pelo parâmetro de inicialização NLS_TIMESTAMP_TZ_FORMAT. O tamanho é fixado em 13 bytes. Este tipo de dados contém os campos de data e hora YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR e TIMEZONE_MINUTE. Possui fracionários de segundos e um fuso horário explícito.

TIMESTAMP [(fractional_seconds_precision)] COM FUSO HORÁRIO LOCAL

Todos os valores de TIMESTAMP WITH TIME ZONE, com as seguintes exceções:

Os dados são normalizados para o fuso horário do banco de dados quando são armazenados no banco de dados.

Quando os dados são recuperados, os usuários veem os dados no fuso horário da sessão.

O formato padrão é determinado explicitamente pelo parâmetro NLS_TIMESTAMP_FORMAT ou implicitamente pelo parâmetro NLS_TERRITORY. O tamanho é 7 ou 11 bytes, dependendo da precisão.

INTERVAL YEAR [(year_precision)] TO MONTH

Armazena um período de tempo em anos e meses, em que year_precision é o número de dígitos no campo de data e hora YEAR. Os valores aceitos são de 0 a 9. O padrão é 2. O tamanho é fixado em 5 bytes.

INTERVAL DAY [(day_precision)] TO SECOND [(fracionário_seconds_precision)]

Armazena um período de tempo em dias, horas, minutos e segundos, onde

day_precision é o número máximo de dígitos no campo de data e hora DAY. Os valores aceitos são de 0 a 9. O padrão é 2.

fractional_seconds_precision é o número de dígitos na parte fracionária do campo SEGUNDO. Os valores aceitos são de 0 a 9. O padrão é 6.

O tamanho é fixado em 11 bytes.

Dados binários brutos de bytes de tamanho de comprimento. Você deve especificar o tamanho para um valor RAW. O tamanho máximo é:

32.767 bytes se MAX_STRING_SIZE = EXTENDED

2.000 bytes se MAX_STRING_SIZE = STANDARD

Consulte Tipos de dados estendidos para obter mais informações sobre o parâmetro de inicialização MAX_STRING_SIZE.

Dados binários brutos de comprimento variável de até 2 gigabytes.

Sequência de base 64 que representa o endereço exclusivo de uma linha em sua tabela. Este tipo de dados é principalmente para valores retornados pela pseudocoluna ROWID.

String de base 64 que representa o endereço lógico de uma linha de uma tabela organizada por índice. O tamanho opcional é o tamanho de uma coluna do tipo UROWID. O tamanho máximo e padrão é 4000 bytes.

Dados de caracteres de comprimento fixo de bytes ou caracteres de tamanho de comprimento. O tamanho máximo é de 2.000 bytes ou caracteres. O tamanho padrão e mínimo é de 1 byte.

BYTE e CHAR têm a mesma semântica de VARCHAR2.

Dados de caracteres de comprimento fixo de caracteres de tamanho de comprimento. O número de bytes pode ser até duas vezes o tamanho para a codificação AL16UTF16 e três vezes o tamanho para a codificação UTF8. O tamanho máximo é determinado pela definição do conjunto de caracteres nacional, com um limite superior de 2.000 bytes. O tamanho padrão e mínimo é 1 caractere.

Um objeto grande de caractere contendo caracteres de byte único ou multibyte. Ambos os conjuntos de caracteres de largura fixa e variável são suportados, ambos usando o conjunto de caracteres do banco de dados. O tamanho máximo é (4 gigabytes - 1) * (tamanho do bloco do banco de dados).

Um objeto grande de caractere que contém caracteres Unicode. Ambos os conjuntos de caracteres de largura fixa e variável são suportados, ambos usando o conjunto de caracteres nacional do banco de dados. O tamanho máximo é (4 gigabytes - 1) * (tamanho do bloco do banco de dados). Armazena dados do conjunto de caracteres nacionais.

Um grande objeto binário. O tamanho máximo é (4 gigabytes - 1) * (tamanho do bloco do banco de dados).

Contém um localizador para um grande arquivo binário armazenado fora do banco de dados. Ativa o acesso de E / S do fluxo de bytes a LOBs externos que residem no servidor de banco de dados. O tamanho máximo é de 4 gigabytes.

As seções a seguir descrevem os tipos de dados Oracle conforme são armazenados no banco de dados Oracle. Para obter informações sobre como especificar esses tipos de dados como literais, consulte Literais.

Tipos de dados de caracteres

Os tipos de dados de caracteres armazenam dados de caracteres (alfanuméricos), que são palavras e texto de forma livre, no conjunto de caracteres do banco de dados ou no conjunto de caracteres nacionais. Eles são menos restritivos do que outros tipos de dados e, conseqüentemente, têm menos propriedades. Por exemplo, colunas de caracteres podem armazenar todos os valores alfanuméricos, mas NUMBER colunas podem armazenar apenas valores numéricos.

Os dados de caracteres são armazenados em strings com valores de bytes correspondentes a um dos conjuntos de caracteres, como ASCII de 7 bits ou EBCDIC, especificados quando o banco de dados foi criado. O banco de dados Oracle oferece suporte a conjuntos de caracteres de byte único e multibyte.

Esses tipos de dados são usados ​​para dados de caracteres:

Para obter informações sobre como especificar tipos de dados de caractere como literais, consulte Literais de texto.

Tipo de dados CHAR

O tipo de dados CHAR especifica uma cadeia de caracteres de comprimento fixo no conjunto de caracteres do banco de dados. Você especifica o conjunto de caracteres do banco de dados ao criar seu banco de dados.

Ao criar uma tabela com uma coluna CHAR, você especifica o comprimento da coluna como tamanho, opcionalmente seguido por um qualificador de comprimento. O qualificador BYTE denota semântica de comprimento de byte, enquanto o qualificador CHAR denota semântica de comprimento de caractere. Na semântica do comprimento do byte, o tamanho é o número de bytes a serem armazenados na coluna. Na semântica de comprimento de caractere, o tamanho é o número de pontos de código no conjunto de caracteres do banco de dados para armazenar na coluna. Um ponto de código pode ter de 1 a 4 bytes, dependendo do conjunto de caracteres do banco de dados e do caractere particular codificado pelo ponto de código. A Oracle recomenda que você especifique um dos qualificadores de comprimento para documentar explicitamente a semântica de comprimento desejada da coluna. Se você não especificar um qualificador, o valor do parâmetro NLS_LENGTH_SEMANTICS da sessão que cria a coluna define a semântica de comprimento, a menos que a tabela pertença ao esquema SYS, caso em que a semântica padrão é BYTE.

O Oracle garante que todos os valores armazenados em uma coluna CHAR tenham o comprimento especificado por tamanho na semântica de comprimento selecionada. Se você inserir um valor menor que o comprimento da coluna, o Oracle preencherá o valor com o comprimento da coluna. Se você tentar inserir um valor muito longo para a coluna, o Oracle retornará um erro. Observe que, se o comprimento da coluna for expresso em caracteres (pontos de código), o preenchimento em branco não garante que todos os valores da coluna tenham o mesmo comprimento de byte.

Você pode omitir o tamanho da definição da coluna. O valor padrão é 1.

O valor máximo de tamanho é 2.000, o que significa 2.000 bytes ou caracteres (pontos de código), dependendo da semântica de comprimento selecionada. No entanto, independentemente, o comprimento máximo absoluto de qualquer valor de caractere que pode ser armazenado em uma coluna CHAR é de 2.000 bytes. Por exemplo, mesmo se você definir o comprimento da coluna como 2.000 caracteres, o Oracle retornará um erro se você tentar inserir um valor de 2.000 caracteres em que um ou mais pontos de código sejam maiores que 1 byte. O valor do tamanho em caracteres é uma restrição de comprimento, não é uma capacidade garantida. Se você deseja que uma coluna CHAR seja sempre capaz de armazenar caracteres de tamanho em qualquer conjunto de caracteres de banco de dados, use um valor de tamanho menor ou igual a 500.

Para garantir a conversão de dados adequada entre bancos de dados e clientes com conjuntos de caracteres diferentes, você deve assegurar que os dados CHAR consistam em cadeias bem formadas.

Guia de Suporte à Globalização do Banco de Dados Oracle para obter mais informações sobre suporte a conjuntos de caracteres e Regras de Comparação de Tipo de Dados para obter informações sobre semântica de comparação

Tipo de dados NCHAR

O tipo de dados NCHAR especifica uma cadeia de caracteres de comprimento fixo no conjunto de caracteres nacional. Você especifica o conjunto de caracteres nacionais como AL16UTF16 ou UTF8 ao criar seu banco de dados. AL16UTF16 e UTF8 são duas formas de codificação do conjunto de caracteres Unicode (UTF-16 e CESU-8, correspondentemente) e, portanto, NCHAR é um tipo de dados somente Unicode.

Ao criar uma tabela com uma coluna NCHAR, você especifica o comprimento da coluna como caracteres de tamanho ou, mais precisamente, pontos de código no conjunto de caracteres nacionais. Um ponto de código tem sempre 2 bytes em AL16UTF16 e de 1 a 3 bytes em UTF8, dependendo do caractere particular codificado pelo ponto de código.

O Oracle garante que todos os valores armazenados em uma coluna NCHAR tenham o comprimento de caracteres de tamanho. Se você inserir um valor menor que o comprimento da coluna, o Oracle preencherá o valor com o comprimento da coluna. Se você tentar inserir um valor muito longo para a coluna, o Oracle retornará um erro. Observe que, se o conjunto de caracteres nacionais for UTF8, o preenchimento em branco não garante que todos os valores da coluna tenham o mesmo comprimento de byte.

Você pode omitir o tamanho da definição da coluna. O valor padrão é 1.

O valor máximo de tamanho é 1000 caracteres quando o conjunto de caracteres nacionais é AL16UTF16 e 2000 caracteres quando o conjunto de caracteres nacionais é UTF8. No entanto, independentemente, o comprimento máximo absoluto de qualquer valor de caractere que pode ser armazenado em uma coluna NCHAR é de 2.000 bytes. Por exemplo, mesmo se você definir o comprimento da coluna como 1000 caracteres, o Oracle retornará um erro se você tentar inserir um valor de 1000 caracteres, mas o conjunto de caracteres nacionais for UTF8 e todos os pontos de código tiverem 3 bytes de largura. O valor do tamanho é uma restrição de comprimento, não capacidade garantida. Se você deseja que uma coluna NCHAR seja sempre capaz de armazenar caracteres de tamanho em ambos os conjuntos de caracteres nacionais, use um valor de tamanho menor ou igual a 666.

Para garantir a conversão de dados adequada entre bancos de dados e clientes com conjuntos de caracteres diferentes, você deve garantir que os dados NCHAR consistam em cadeias de caracteres bem formadas.

Se você atribuir um valor CHAR a uma coluna NCHAR, o valor será convertido implicitamente do conjunto de caracteres do banco de dados para o conjunto de caracteres nacional. Se você atribuir um valor NCHAR a uma coluna CHAR, o valor será convertido implicitamente do conjunto de caracteres nacional para o conjunto de caracteres do banco de dados. Se alguns dos caracteres do valor NCHAR não puderem ser representados no conjunto de caracteres do banco de dados, se o valor do parâmetro de sessão NLS_NCHAR_CONV_EXCP for TRUE, o Oracle relatará um erro. Se o valor do parâmetro for FALSE, os caracteres não representáveis ​​são substituídos pelo caractere de substituição padrão do conjunto de caracteres do banco de dados, que geralmente é o ponto de interrogação '?' ou o ponto de interrogação invertido '¿'.

Guia de suporte à globalização do banco de dados Oracle para obter informações sobre suporte a tipos de dados Unicode

Tipo de dados VARCHAR2

O tipo de dados VARCHAR2 especifica uma cadeia de caracteres de comprimento variável no conjunto de caracteres do banco de dados. Você especifica o conjunto de caracteres do banco de dados ao criar seu banco de dados.

Ao criar uma tabela com uma coluna VARCHAR2, você deve especificar o comprimento da coluna como tamanho opcionalmente seguido por um qualificador de comprimento. O qualificador BYTE denota semântica de comprimento de byte enquanto o qualificador CHAR denota semântica de comprimento de caractere. Na semântica do comprimento do byte, o tamanho é o número máximo de bytes que podem ser armazenados na coluna. Na semântica de comprimento de caractere, o tamanho é o número máximo de pontos de código no conjunto de caracteres do banco de dados que podem ser armazenados na coluna. Um ponto de código pode ter de 1 a 4 bytes, dependendo do conjunto de caracteres do banco de dados e do caractere particular codificado pelo ponto de código. A Oracle recomenda que você especifique um dos qualificadores de comprimento para documentar explicitamente a semântica de comprimento desejada da coluna.Se você não especificar um qualificador, o valor do parâmetro NLS_LENGTH_SEMANTICS da sessão que cria a coluna define a semântica de comprimento, a menos que a tabela pertença ao esquema SYS, caso em que a semântica padrão é BYTE.

O Oracle armazena um valor de caractere em uma coluna VARCHAR2 exatamente como você especificou, sem nenhum preenchimento em branco, desde que o valor não exceda o comprimento da coluna. Se você tentar inserir um valor que exceda o comprimento especificado, o Oracle retornará um erro.

O valor mínimo de tamanho é 1. O valor máximo é:

32.767 bytes se MAX_STRING_SIZE = EXTENDED

4000 bytes se MAX_STRING_SIZE = STANDARD

Consulte Tipos de dados estendidos para obter mais informações sobre o parâmetro de inicialização MAX_STRING_SIZE e os mecanismos de armazenamento interno para tipos de dados estendidos.

Embora o tamanho possa ser expresso em bytes ou caracteres (pontos de código), o comprimento máximo absoluto independente de qualquer valor de caractere que pode ser armazenado em uma coluna VARCHAR2 é 32767 ou 4000 bytes, dependendo de MAX_STRING_SIZE. Por exemplo, mesmo se você definir o comprimento da coluna como 32.767 caracteres, o Oracle retornará um erro se você tentar inserir um valor de 32.767 caracteres em que um ou mais pontos de código sejam maiores que 1 byte. O valor do tamanho em caracteres é uma restrição de comprimento, não é uma capacidade garantida. Se você deseja que uma coluna VARCHAR2 seja sempre capaz de armazenar caracteres de tamanho em qualquer conjunto de caracteres do banco de dados, use um valor de tamanho menor ou igual a 8191, se MAX_STRING_SIZE = EXTENDED, ou 1000, se MAX_STRING_SIZE = STANDARD.

O Oracle compara os valores VARCHAR2 usando semântica de comparação não preenchida.

Para garantir a conversão de dados adequada entre bancos de dados com conjuntos de caracteres diferentes, você deve assegurar que os dados VARCHAR2 consistam em cadeias bem formadas. Consulte o Oracle Database Globalization Support Guide para obter mais informações sobre o suporte a conjuntos de caracteres.

Regras de comparação de tipo de dados para obter informações sobre semântica de comparação

Tipo de dados VARCHAR

Não use o tipo de dados VARCHAR. Em vez disso, use o tipo de dados VARCHAR2. Embora o tipo de dados VARCHAR seja atualmente sinônimo de VARCHAR2, o tipo de dados VARCHAR está planejado para ser redefinido como um tipo de dados separado usado para cadeias de caracteres de comprimento variável em comparação com semânticas de comparação diferentes.

Tipo de dados NVARCHAR2

O tipo de dados NVARCHAR2 especifica uma cadeia de caracteres de comprimento variável no conjunto de caracteres nacional. Você especifica o conjunto de caracteres nacionais como AL16UTF16 ou UTF8 ao criar seu banco de dados. AL16UTF16 e UTF8 são duas formas de codificação do conjunto de caracteres Unicode (UTF-16 e CESU-8, correspondentemente) e, portanto, NVARCHAR2 é um tipo de dados somente Unicode.

Ao criar uma tabela com uma coluna NVARCHAR2, você deve especificar o comprimento da coluna como caracteres de tamanho ou, mais precisamente, pontos de código no conjunto de caracteres nacionais. Um ponto de código tem sempre 2 bytes em AL16UTF16 e de 1 a 3 bytes em UTF8, dependendo do caractere particular codificado pelo ponto de código.

O Oracle armazena um valor de caractere em uma coluna NVARCHAR2 exatamente como você especificou, sem qualquer preenchimento em branco, desde que o valor não exceda o comprimento da coluna. Se você tentar inserir um valor que exceda o comprimento especificado, o Oracle retornará um erro.

O valor mínimo de tamanho é 1. O valor máximo é:

16383 se MAX_STRING_SIZE = EXTENDED e o conjunto de caracteres nacionais for AL16UTF16

32767 se MAX_STRING_SIZE = EXTENDED e o conjunto de caracteres nacionais for UTF8

2000 se MAX_STRING_SIZE = STANDARD e o conjunto de caracteres nacionais for AL16UTF16

4000 se MAX_STRING_SIZE = STANDARD e o conjunto de caracteres nacionais for UTF8

Consulte Tipos de dados estendidos para obter mais informações sobre o parâmetro de inicialização MAX_STRING_SIZE e os mecanismos de armazenamento interno para tipos de dados estendidos.

Independentemente do comprimento máximo da coluna em caracteres, o comprimento máximo absoluto de qualquer valor que pode ser armazenado em uma coluna NVARCHAR2 é 32767 ou 4000 bytes, dependendo de MAX_STRING_SIZE. Por exemplo, mesmo se você definir o comprimento da coluna como 16383 caracteres, o Oracle retornará um erro se você tentar inserir um valor de 16383 caracteres, mas o conjunto de caracteres nacionais for UTF8 e todos os pontos de código tiverem 3 bytes de largura. O valor do tamanho é uma restrição de comprimento, não capacidade garantida. Se você deseja que uma coluna NVARCHAR2 seja sempre capaz de armazenar caracteres de tamanho em ambos os conjuntos de caracteres nacionais, use um valor de tamanho que seja menor ou igual a 10922, se MAX_STRING_SIZE = EXTENDED, ou 1333, se MAX_STRING_SIZE = STANDARD.

O Oracle compara os valores NVARCHAR2 usando semântica de comparação não preenchida.

Para garantir a conversão de dados adequada entre bancos de dados e clientes com diferentes conjuntos de caracteres, você deve assegurar que os dados NVARCHAR2 consistam em cadeias bem formadas.

Se você designar um valor VARCHAR2 a uma coluna NVARCHAR2, o valor será convertido implicitamente do conjunto de caracteres do banco de dados para o conjunto de caracteres nacional. Se você designar um valor NVARCHAR2 a uma coluna VARCHAR2, o valor será convertido implicitamente do conjunto de caracteres nacionais para o conjunto de caracteres do banco de dados. Se alguns dos caracteres do valor NVARCHAR2 não puderem ser representados no conjunto de caracteres do banco de dados, se o valor do parâmetro de sessão NLS_NCHAR_CONV_EXCP for TRUE, o Oracle relatará um erro. Se o valor do parâmetro for FALSE, os caracteres não representáveis ​​são substituídos pelo caractere de substituição padrão do conjunto de caracteres do banco de dados, que geralmente é o ponto de interrogação '?' ou o ponto de interrogação invertido '¿'.

Guia de suporte à globalização do banco de dados Oracle para obter informações sobre suporte a tipos de dados Unicode.

Tipos de dados numéricos

Os tipos de dados numéricos do banco de dados Oracle armazenam números positivos e negativos fixos e de ponto flutuante, zero, infinito e valores que são o resultado indefinido de uma operação - "não é um número" ou NAN. Para obter informações sobre como especificar tipos de dados numéricos como literais, consulte Literais numéricos.

NUMBER tipo de dados

O tipo de dados NUMBER armazena zero, bem como números fixos positivos e negativos com valores absolutos de 1,0 x 10 -130 a, mas não incluindo, 1,0 x 10 126. Se você especificar uma expressão aritmética cujo valor tenha um valor absoluto maior ou igual a 1,0 x 10 126, o Oracle retornará um erro. Cada valor NUMBER requer de 1 a 22 bytes.

Especifique um número de ponto fixo usando o seguinte formulário:

p é a precisão, ou o número máximo de dígitos decimais significativos, em que o dígito mais significativo é o dígito diferente de zero mais à esquerda e o dígito menos significativo é o dígito mais conhecido à direita. A Oracle garante a portabilidade de números com precisão de até 20 dígitos base 100, o que equivale a 39 ou 40 dígitos decimais dependendo da posição da vírgula decimal.

s é a escala ou o número de dígitos da vírgula decimal até o dígito menos significativo. A escala pode variar de -84 a 127.

A escala positiva é o número de dígitos significativos à direita da vírgula decimal e incluindo o dígito menos significativo.

A escala negativa é o número de dígitos significativos à esquerda da vírgula decimal, sem incluir o dígito menos significativo. Para escala negativa, o dígito menos significativo está no lado esquerdo da vírgula decimal, porque os dados reais são arredondados para o número especificado de casas à esquerda da vírgula decimal. Por exemplo, uma especificação de (10, -2) significa arredondar para centenas.

A escala pode ser maior do que a precisão, mais comumente quando a notação e é usada. Quando a escala é maior que a precisão, a precisão especifica o número máximo de dígitos significativos à direita da vírgula decimal. Por exemplo, uma coluna definida como NUMBER (4,5) requer um zero para o primeiro dígito após a vírgula decimal e arredonda todos os valores após o quinto dígito após a vírgula decimal.

É uma boa prática especificar a escala e a precisão de uma coluna de número de ponto fixo para verificação de integridade extra na entrada. Especificar escala e precisão não força todos os valores a um comprimento fixo. Se um valor exceder a precisão, o Oracle retornará um erro. Se um valor exceder a escala, o Oracle o arredondará.

Especifique um número inteiro usando o seguinte formato:

Isso representa um número de ponto fixo com precisão pe escala 0 e é equivalente a NUMBER (p, 0).

Especifique um número de ponto flutuante usando o seguinte formato:

A ausência de designadores de precisão e escala especifica o intervalo e a precisão máximos para um número Oracle.

A Tabela 2-2 mostra como o Oracle armazena dados usando diferentes precisões e escalas.


RÁPIDO E FÁCIL

@heridev e eu criamos uma pequena função no jQuery.

O problema com valores de ponto flutuante é que eles estão tentando representar uma quantidade infinita de valores (contínuos) com uma quantidade fixa de bits. Então, naturalmente, deve haver alguma perda no jogo, e você será mordido por alguns valores.

Quando um computador armazena 1,275 como um valor de ponto flutuante, ele não se lembrará realmente se foi 1,275 ou 1,27499999999999993, ou mesmo 1,27500000000000002. Esses valores devem dar resultados diferentes após o arredondamento para duas casas decimais, mas não irão, pois para o computador eles parecem exatamente o mesmo depois de armazenar como valores de ponto flutuante, e não há como restaurar os dados perdidos. Quaisquer cálculos adicionais apenas acumularão essa imprecisão.

Portanto, se a precisão for importante, você deve evitar valores de ponto flutuante desde o início. As opções mais simples são

  • use uma biblioteca dedicada
  • use strings para armazenar e passar os valores (acompanhados por operações de string)
  • use números inteiros (por exemplo, você pode passar a quantidade de centésimos de seu valor real, por exemplo, valor em centavos em vez de valor em dólares)

Por exemplo, ao usar inteiros para armazenar o número de centésimos, a função para encontrar o valor real é bastante simples:

Com cordas, você precisará de arredondamento, mas ainda é gerenciável:

Observe que esta função é arredondada para o mais próximo, laços longe de zero, enquanto o IEEE 754 recomenda o arredondamento para o mais próximo, laços para mesmo como o comportamento padrão para operações de ponto flutuante. Essas modificações são deixadas como um exercício para o leitor :)


Conteúdo

A agricultura de precisão é um componente chave da terceira onda de revoluções agrícolas modernas. A primeira revolução agrícola foi o aumento da agricultura mecanizada, de 1900 a 1930. Cada agricultor produziu comida suficiente para alimentar cerca de 26 pessoas durante esse período. [12] A década de 1960 levou à Revolução Verde com novos métodos de modificação genética, o que levou cada agricultor a alimentar cerca de 156 pessoas. [12] Espera-se que em 2050, a população global alcance cerca de 9,6 bilhões, e a produção de alimentos deve efetivamente dobrar dos níveis atuais, a fim de alimentar todas as bocas. Com os novos avanços tecnológicos na revolução agrícola da agricultura de precisão, cada agricultor será capaz de alimentar 265 pessoas na mesma área. [12]

A primeira onda da revolução da agricultura de precisão veio na forma de imagens de satélite e aéreas, previsão do tempo, aplicação de fertilizantes de taxa variável e indicadores de saúde das colheitas. A segunda onda agrega os dados da máquina para um plantio, mapeamento topográfico e dados de solo ainda mais precisos. [13]

A agricultura de precisão visa otimizar o gerenciamento em nível de campo no que diz respeito a:

    : combinando as práticas agrícolas mais de perto com as necessidades das culturas (por exemplo, insumos de fertilizantes): reduzindo os riscos ambientais e a pegada da agricultura (por exemplo, limitando a lixiviação de nitrogênio): aumentando a competitividade por meio de práticas mais eficientes (por exemplo, melhor gestão do uso de fertilizantes e outros insumos) .

A agricultura de precisão também fornece aos agricultores uma riqueza de informações para:

  • construir um registro de sua fazenda
  • melhorar a tomada de decisão
  • promover maior rastreabilidade
  • melhorar a comercialização de produtos agrícolas
  • melhorar acordos de arrendamento e relacionamento com proprietários
  • melhorar a qualidade inerente dos produtos agrícolas (por exemplo, nível de proteína em farinha de pão de trigo)

Edição de plantio prescritivo

Plantio prescritivo é um tipo de sistema de cultivo que fornece conselhos de plantio baseados em dados que podem determinar taxas de plantio variáveis ​​para acomodar condições variáveis ​​em um único campo, a fim de maximizar o rendimento. Foi descrito como "Big Data na fazenda". Monsanto, DuPont e outras empresas estão lançando essa tecnologia nos Estados Unidos. [14] [15]

A agricultura de precisão usa muitas ferramentas, mas aqui estão alguns dos princípios básicos: tratores, colheitadeiras, pulverizadores, plantadeiras, escavadeiras, todos considerados sistemas de orientação automática. Os pequenos dispositivos nos equipamentos que utilizam GIS (sistema de informações geográficas) são o que torna a precisão do que ela é. Você pode pensar no sistema GIS como o "cérebro". Para poder usar a agricultura de precisão, o equipamento precisa ser conectado com a tecnologia e os sistemas de dados corretos. Mais ferramentas incluem tecnologia de taxa variável (VRT), sistema de posicionamento global e sistema de informações geográficas, amostragem de grade e sensores remotos. [16]

Edição de geolocalização

A localização geográfica de um campo permite que o agricultor sobreponha informações coletadas da análise de solos e nitrogênio residual e informações sobre safras anteriores e resistividade do solo. A geolocalização é feita de duas maneiras

  • O campo é delineado usando um receptor GPS no veículo enquanto o fazendeiro dirige um trator pelo campo.
  • O campo é delineado em um mapa base derivado de imagens aéreas ou de satélite. As imagens de base devem ter o nível certo de resolução e qualidade geométrica para garantir que a geolocalização é suficientemente precisa.

Editar Variáveis

A variabilidade intra e inter-campo pode resultar de uma série de fatores. Isso inclui condições climáticas (granizo, seca, chuva, etc.), solos (textura, profundidade, níveis de nitrogênio), práticas de cultivo (plantio direto), ervas daninhas e doenças. Indicadores permanentes - principalmente indicadores de solo - fornecem aos agricultores informações sobre as principais constantes ambientais. Indicadores de ponto permitem que eles acompanhem o status de uma cultura, ou seja, para ver se doenças estão se desenvolvendo, se a cultura está sofrendo de estresse hídrico, estresse de nitrogênio ou acamamento, se foi danificada pelo gelo e assim por diante. Essas informações podem vir de estações meteorológicas e outros sensores (resistividade elétrica do solo, detecção a olho nu, imagens de satélite, etc.). As medições de resistividade do solo combinadas com a análise do solo tornam possível medir o teor de umidade. A resistividade do solo também é uma medida relativamente simples e barata. [17]

Edição de estratégias

Usando mapas de solo, os agricultores podem seguir duas estratégias para ajustar os insumos do campo:

  • Abordagem preditiva: baseada na análise de indicadores estáticos (solo, resistividade, histórico de campo, etc.) durante o ciclo da cultura.
  • Abordagem de controle: as informações dos indicadores estáticos são atualizadas regularmente durante o ciclo da cultura por:
    • amostragem: pesando biomassa, medindo o teor de clorofila nas folhas, pesando frutas, etc.
    • sensoriamento remoto: medição de parâmetros como temperatura (ar / solo), umidade (ar / solo / folha), vento ou diâmetro do caule é possível graças às Redes de Sensores Sem Fio [18] e Internet das coisas (IoT)
    • detecção de proxy: sensores no veículo medem o status da folha, o que exige que o agricultor dirija por todo o campo.
    • sensoriamento remoto aéreo ou por satélite: imagens multiespectrais são adquiridas e processadas para derivar mapas de parâmetros biofísicos da cultura, incluindo indicadores de doenças. [19] Instrumentos aerotransportados são capazes de medir a quantidade de cobertura vegetal e distinguir entre plantações e ervas daninhas. [20]

    As decisões podem ser baseadas em modelos de suporte à decisão (modelos de simulação de safra e modelos de recomendação) baseados em big data, mas na análise final cabe ao agricultor decidir em termos de valor de negócio e impactos no meio ambiente - um papel sendo assumido por sistemas de inteligência artificial (IA) baseados em aprendizado de máquina e redes neurais artificiais.

    É importante perceber porque a tecnologia de PA é ou não adotada, "para que a adoção da tecnologia de PA ocorra, o agricultor deve perceber a tecnologia como útil e fácil de usar. Pode ser insuficiente ter dados externos positivos sobre os benefícios econômicos da PA tecnologia como percepções dos agricultores devem refletir essas considerações econômicas. " [21]

    Práticas de implementação Editar

    As novas tecnologias de informação e comunicação tornam o manejo da cultura em nível de campo mais operacional e mais fácil de alcançar para os agricultores. A aplicação de decisões de gestão de culturas exige equipamento agrícola que suporte tecnologia de taxa variável (VRT), por exemplo, a densidade de sementes variando junto com a aplicação de taxa variável (VRA) de nitrogênio e produtos fitossanitários. [22]

    A agricultura de precisão usa tecnologia em equipamentos agrícolas (por exemplo, tratores, pulverizadores, colheitadeiras, etc.):

      (por exemplo, receptores de GPS que usam sinais de satélite para determinar com precisão uma posição no globo) (GIS), ou seja, software que faz sentido para todos os dados disponíveis
  • equipamento agrícola de taxa variável (semeadora, espalhadora).
  • O conceito de agricultura de precisão surgiu pela primeira vez nos Estados Unidos no início dos anos 1980. Em 1985, pesquisadores da Universidade de Minnesota variaram os insumos de cal em plantações. Foi também nessa época que surgiu a prática da amostragem em grade (aplicando uma grade fixa de uma amostra por hectare). No final da década de 1980, esta técnica foi usada para derivar os primeiros mapas de recomendação de entrada para fertilizantes e correções de pH. O uso de sensores de rendimento desenvolvidos a partir de novas tecnologias, aliado ao advento dos receptores GPS, vem ganhando espaço desde então. Hoje, esses sistemas cobrem vários milhões de hectares.

    No meio-oeste americano (EUA), ela não está associada à agricultura sustentável, mas aos agricultores tradicionais que estão tentando maximizar os lucros gastando dinheiro apenas em áreas que requerem fertilizantes. Esta prática permite que o agricultor varie a taxa de fertilizante no campo de acordo com a necessidade identificada pela Grade guiada por GPS ou Amostragem de Zona. O fertilizante que seria espalhado em áreas que não precisam pode ser colocado em áreas que precisam, otimizando seu uso.

    Em todo o mundo, a agricultura de precisão desenvolveu-se em ritmos variáveis. Os países precursores foram os Estados Unidos, Canadá e Austrália. Na Europa, o Reino Unido foi o primeiro a trilhar esse caminho, seguido de perto pela França, onde apareceu pela primeira vez em 1997-1998. Na América Latina, o país líder é a Argentina, onde foi implantado em meados da década de 1990 com o apoio do Instituto Nacional de Tecnologia Agropecuária. O Brasil criou uma empresa estatal, a Embrapa, para pesquisar e desenvolver uma agricultura sustentável. O desenvolvimento de GPS e técnicas de propagação de taxa variável ajudaram a ancorar as práticas de manejo da agricultura de precisão [23]. Hoje, menos de 10% dos agricultores da França estão equipados com sistemas de taxa variável. O uso do GPS é mais difundido, mas isso não os impediu de usar os serviços de agricultura de precisão, que fornecem mapas de recomendação em nível de campo. [24]

    Um terço da população global ainda depende da agricultura para viver. [25] Embora as tecnologias de agricultura de precisão mais avançadas exijam grandes investimentos iniciais, os agricultores dos países em desenvolvimento estão se beneficiando da tecnologia móvel. Este serviço auxilia os agricultores com pagamentos e recebimentos móveis para melhorar a eficiência. Por exemplo, 30.000 agricultores na Tanzânia usam telefones celulares para contratos, pagamentos, empréstimos e organização de negócios. [25]

    Os benefícios econômicos e ambientais da agricultura de precisão também foram confirmados na China, mas a China está ficando para trás em países como a Europa e os Estados Unidos porque o sistema agrícola chinês é caracterizado por fazendas familiares em pequena escala, o que torna a taxa de adoção de agricultura de precisão inferior a outros países. Portanto, a China está tentando introduzir melhor a tecnologia da agricultura de precisão em seu próprio país e reduzir alguns riscos, abrindo caminho para que a tecnologia chinesa desenvolva a agricultura de precisão no futuro. [26]

    Agricultura de precisão, como o nome indica, significa a aplicação de quantidades precisas e corretas de insumos como água, fertilizantes, pesticidas etc. na época certa para a colheita para aumentar sua produtividade e maximizar seus rendimentos. As práticas de gestão de agricultura de precisão podem reduzir significativamente a quantidade de nutrientes e outros insumos agrícolas usados ​​enquanto aumentam os rendimentos. [27] Os agricultores obtêm, portanto, um retorno sobre seu investimento, economizando nos custos de água, pesticidas e fertilizantes.

    O segundo benefício em maior escala de direcionar os insumos diz respeito aos impactos ambientais. Aplicar a quantidade certa de produtos químicos no lugar certo e na hora certa beneficia as culturas, os solos e as águas subterrâneas e, portanto, todo o ciclo da cultura. [28] Consequentemente, a agricultura de precisão tornou-se uma pedra angular da agricultura sustentável, uma vez que respeita culturas, solos e agricultores. A agricultura sustentável busca assegurar um suprimento contínuo de alimentos dentro dos limites ecológicos, econômicos e sociais necessários para sustentar a produção a longo prazo.

    Um artigo de 2013 tentou mostrar que a agricultura de precisão pode ajudar os agricultores de países em desenvolvimento como a Índia. [29]

    A agricultura de precisão reduz a pressão sobre a agricultura para o meio ambiente, aumentando a eficiência das máquinas e colocando-as em uso. Por exemplo, o uso de dispositivos de gerenciamento remoto como GPS reduz o consumo de combustível para a agricultura, enquanto a aplicação de taxa variável de nutrientes ou pesticidas pode potencialmente reduzir o uso desses insumos, economizando custos e reduzindo o escoamento prejudicial para os cursos d'água. [30]

    A agricultura de precisão é uma aplicação de tecnologias agrícolas digitais inovadoras. Mais de US $ 4,6 bilhões foram investidos em empresas de tecnologia agrícola - às vezes chamadas de agtech. [12]

    Robots Edit

    Os tratores autodirecionados já existem há algum tempo, já que o equipamento John Deere funciona como um avião em piloto automático. O trator faz a maior parte do trabalho, com o fazendeiro intervindo para emergências. [28] A tecnologia está avançando em direção a máquinas sem condutor programadas por GPS para espalhar fertilizantes ou arar a terra. Outras inovações incluem uma máquina movida a energia solar que identifica ervas daninhas e as mata com precisão com uma dose de herbicida ou lasers. [28] Robôs agrícolas, também conhecidos como AgBots, já existem, mas robôs de colheita avançados estão sendo desenvolvidos para identificar frutas maduras, ajustar-se à sua forma e tamanho e retirá-las cuidadosamente dos galhos. [31]

    Drones e imagens de satélite Editar

    Drone e tecnologia de satélite são usados ​​na agricultura de precisão. Isso geralmente ocorre quando drones tiram imagens de alta qualidade enquanto os satélites capturam a imagem maior. Os pilotos de aeronaves leves podem combinar fotografia aérea com dados de registros de satélite para prever rendimentos futuros com base no nível atual de biomassa de campo. Imagens agregadas podem criar mapas de contorno para rastrear onde a água flui, determinar semeadura de taxa variável e criar mapas de produção de áreas que eram mais ou menos produtivas. [28]

    A Internet das coisas Editar

    A Internet das coisas é a rede de objetos físicos equipados com eletrônicos que permitem a coleta e agregação de dados. A IoT entra em ação com o desenvolvimento de sensores [32] e software de gerenciamento de fazendas. Por exemplo, os agricultores podem medir espectroscopicamente nitrogênio, fósforo e potássio em esterco líquido, o que é notoriamente inconsistente. [28] Eles podem escanear o solo para ver onde as vacas já urinaram e aplicar fertilizante apenas nos locais que precisam. Isso reduz o uso de fertilizantes em até 30%. [31] Sensores de umidade [33] no solo determinam os melhores momentos para regar remotamente as plantas. Os sistemas de irrigação podem ser programados para trocar de lado do tronco da árvore que regam com base na necessidade da planta e na precipitação. [28]

    As inovações não se limitam apenas às plantas - elas podem ser usadas para o bem-estar dos animais. O gado pode ser equipado com sensores internos para monitorar a acidez do estômago e problemas digestivos. Sensores externos rastreiam os padrões de movimento para determinar a saúde e a aptidão da vaca, detectam lesões físicas e identificam os horários ideais para a reprodução. [28] Todos esses dados de sensores podem ser agregados e analisados ​​para detectar tendências e padrões.

    Como outro exemplo, a tecnologia de monitoramento pode ser usada para tornar a apicultura mais eficiente. As abelhas têm um valor econômico significativo e fornecem um serviço vital para a agricultura, polinizando uma variedade de safras. O monitoramento da saúde de uma colônia de abelhas por meio de sensores sem fio de temperatura, umidade e CO2 ajuda a melhorar a produtividade das abelhas e a ler os primeiros avisos nos dados que podem ameaçar a própria sobrevivência de uma colmeia inteira. [34]

    Edição de aplicativos de smartphone

    Os aplicativos para smartphones e tablets estão se tornando cada vez mais populares na agricultura de precisão. Os smartphones vêm com muitos aplicativos úteis já instalados, incluindo câmera, microfone, GPS e acelerômetro. Existem também aplicativos feitos dedicados a várias aplicações agrícolas, como mapeamento de campo, rastreamento de animais, obtenção de informações meteorológicas e de safras e muito mais. Eles são facilmente portáteis, acessíveis e têm um alto poder de computação. [35]

    Edição de aprendizado de máquina

    O aprendizado de máquina é comumente usado em conjunto com drones, robôs e dispositivos da Internet das coisas. Permite a entrada de dados de cada uma dessas fontes. O computador então processa essas informações e envia as ações apropriadas de volta para esses dispositivos. Isso permite que os robôs forneçam a quantidade perfeita de fertilizante ou que os dispositivos IoT forneçam a quantidade perfeita de água diretamente ao solo. [36] O aprendizado de máquina também pode fornecer previsões aos agricultores no ponto de necessidade, como o conteúdo de nitrogênio disponível para as plantas no solo, para orientar o planejamento da fertilização. [37] À medida que mais agricultura se torna cada vez mais digital, o aprendizado de máquina apoiará uma agricultura eficiente e precisa com menos trabalho manual.


    11 Respostas 11

    Você não pode definir a precisão de um duplo (ou duplo) para um número especificado de dígitos decimais, porque os valores de ponto flutuante não têm dígitos decimais. Eles têm dígitos binários.

    Você terá que converter em uma raiz decimal, por meio de BigDecimal ou DecimalFormat, dependendo do que deseja fazer com o valor posteriormente.

    Veja também minha resposta a esta pergunta para uma refutação das respostas inevitáveis ​​* 100/100.

    Você pode tentar BigDecimal para esta finalidade

    Esta é uma maneira fácil de fazer isso:

    Ele define a precisão para 2 dígitos.

    Se você deseja apenas imprimir, use desta forma:

    Para definir a precisão para valores duplos DecimalFormat é uma boa técnica. Para usar esta classe, importe java.text.DecimalFormat e crie um objeto dela, por exemplo

    Então, ele imprimirá dois dígitos após a vírgula decimal aqui, ele imprimirá 12,79

    Esta é uma maneira eficiente de alcançar o resultado com duas ressalvas.

    1. Limita a precisão a 'máximo' N dígitos (não fixado em N dígitos).
    2. Arredonda o número para baixo (não para o mais próximo).

    Veja exemplos de casos de teste aqui.

    Aqui está o código. As duas advertências que mencionei acima podem ser abordadas com bastante facilidade, no entanto, a velocidade era mais importante para mim do que a precisão, então deixei isso aqui. Manipulações de strings como System.out.printf ("%. 2f", 123.234) são computacionalmente caras em comparação com operações matemáticas. Em meus testes, o código abaixo (sem o sysout) demorou 1/30 do tempo em comparação com as manipulações de String.

    A precisão de double e float é fixada por seu tamanho e pela forma como os tipos de ponto flutuante IEEE são implementados.

    O número de dígitos decimais na saída, por outro lado, é uma questão de formatação. Você está correto ao dizer que digitar a mesma constante repetidamente é uma má ideia. Em vez disso, você deve declarar uma constante de string e usar sua representação simbólica.

    Usar uma representação simbólica permitiria que você alterasse a precisão em todos os lugares em que a constante é usada sem pesquisar em seu código.

    Para expandir o @EJP, o conceito de 'precisão' ao lidar com duplas é extremamente complicado. Conforme discutido em https://stackoverflow.com/a/3730040/390153, você não pode nem mesmo representar 0,1 como um duplo, independentemente da precisão, pelo mesmo motivo, você não pode representar 1/3 na base 10 com precisão finita.

    Você precisa considerar o problema que está tentando resolver e considerar:

    a) Se eu estivesse usando duplas em primeiro lugar se a precisão for um conceito relevante, usar duplas pode muito bem ser um erro.

    b) Se os duplos são apropriados, o que quero dizer com precisão? Se você está falando apenas sobre exibição, envolva a lógica em uma função de exibição e você só precisará lidar com isso em um lugar, ou seja. aplicar o princípio DRY.


    Conteúdo

    Edição de números de ponto flutuante

    Uma representação de número especifica alguma maneira de codificar um número, geralmente como uma sequência de dígitos.

    Existem vários mecanismos pelos quais cadeias de dígitos podem representar números. Na notação matemática comum, a sequência de dígitos pode ter qualquer comprimento e a localização do ponto de raiz é indicada colocando um caractere de "ponto" explícito (ponto ou vírgula) ali. Se o ponto de raiz não for especificado, a string representa implicitamente um número inteiro e o ponto de raiz não declarado ficará fora da extremidade direita da string, próximo ao dígito menos significativo. Em sistemas de ponto fixo, uma posição na string é especificada para o ponto raiz. Portanto, um esquema de ponto fixo pode ser usar uma string de 8 dígitos decimais com o ponto decimal no meio, em que "00012345" representaria 0001,2345.

    Em notação científica, o número fornecido é escalado por uma potência de 10, de modo que fique dentro de um determinado intervalo - normalmente entre 1 e 10, com o ponto de raiz aparecendo imediatamente após o primeiro dígito. O fator de escala, como uma potência de dez, é então indicado separadamente no final do número. Por exemplo, o período orbital da lua de Júpiter Io é 152.853,5047 segundos, um valor que seria representado na notação científica padrão como 1,528535047 × 10 5 segundos.

    A representação de ponto flutuante é semelhante em conceito à notação científica. Logicamente, um número de ponto flutuante consiste em:

    • Uma sequência de dígitos com sinal (significando positivo ou negativo) de um determinado comprimento em uma determinada base (ou raiz). Esta sequência de dígitos é conhecida como significando, mantissa, ou coeficiente. [nota 1] O comprimento do significando determina o precisão para os quais os números podem ser representados. Supõe-se que a posição do ponto de raiz esteja sempre em algum lugar dentro do significando - geralmente logo após ou logo antes do dígito mais significativo, ou à direita do dígito mais à direita (menos significativo). Este artigo geralmente segue a convenção de que o ponto de raiz é definido logo após o dígito mais significativo (mais à esquerda).
    • Um expoente inteiro assinado (também conhecido como o característica, ou escala), [nota 2] que modifica a magnitude do número.

    Para derivar o valor do número de ponto flutuante, o significando é multiplicado pelo base elevado ao poder do expoente, equivalente a deslocar o ponto raiz de sua posição implícita por um número de casas iguais ao valor do expoente - para a direita se o expoente for positivo ou para a esquerda se o expoente for negativo.

    Usando a base 10 (a conhecida notação decimal) como exemplo, o número 152.853.5047, que tem dez dígitos decimais de precisão, é representado como o significando 1.528.535.047 junto com 5 como o expoente. Para determinar o valor real, um ponto decimal é colocado após o primeiro dígito do significando e o resultado é multiplicado por 10 5 para dar 1,528535047 × 10 5, ou 152.853,5047. Ao armazenar tal número, a base (10) não precisa ser armazenada, uma vez que será a mesma para toda a gama de números suportados e, portanto, pode ser inferida.

    Simbolicamente, este valor final é:

    onde s é o significando (ignorando qualquer ponto decimal implícito), p é a precisão (o número de dígitos no significando), b é a base (em nosso exemplo, este é o número dez), e e é o expoente.

    Historicamente, várias bases numéricas têm sido usadas para representar números de ponto flutuante, sendo a base dois (binária) a mais comum, seguida pela base dez (ponto flutuante decimal) e outras variedades menos comuns, como a base dezesseis (ponto flutuante hexadecimal [2] [3] [nb 3]), base oito (ponto flutuante octal [4] [3] [5] [2] [nb 4]), base quatro (ponto flutuante quaternário [6] [3] [nb 5]), base três (ponto flutuante ternário balanceado [4]) e base par 256 [3] [nb 6] e base 65.536. [7] [nb 7]

    Um número de ponto flutuante é um número racional, porque pode ser representado como um inteiro dividido por outro, por exemplo 1,45 × 10 3 é (145/100) × 1000 ou 145.000 / 100. A base determina as frações que podem ser representadas, por exemplo, 1/5 não pode ser representado exatamente como um número de ponto flutuante usando uma base binária, mas 1/5 pode ser representado exatamente usando uma base decimal (0,2 ou 2 × 10 - 1). No entanto, 1/3 não pode ser representado exatamente por binário (0,010101.) Ou decimal (0,333.), Mas na base 3, é trivial (0,1 ou 1 × 3 −1). As ocasiões em que ocorrem expansões infinitas dependem da base e de seus fatores principais.

    A maneira como o significando (incluindo seu sinal) e o expoente são armazenados em um computador depende da implementação. Os formatos IEEE comuns são descritos em detalhes posteriormente e em outros lugares, mas como um exemplo, na representação de ponto flutuante de precisão única binária (32 bits), p = 24 < displaystyle p = 24>, e assim o significando é um seqüência de 24 bits. Por exemplo, os primeiros 33 bits do número π são:

    Nesta expansão binária, vamos denotar as posições de 0 (bit mais à esquerda, ou bit mais significativo) a 32 (bit mais à direita). O significando de 24 bits irá parar na posição 23, mostrado como o bit 0 sublinhado acima. O próximo bit, na posição 24, é chamado de bit redondo ou ponta arredondada. É usado para arredondar a aproximação de 33 bits para o número de 24 bits mais próximo (existem regras específicas para valores intermediários, o que não é o caso aqui). Este bit, que é 1 neste exemplo, é adicionado ao número inteiro formado pelos 24 bits mais à esquerda, resultando em:

    Quando é armazenado na memória usando a codificação IEEE 754, torna-se o significando. O significando é assumido como tendo um ponto binário à direita do bit mais à esquerda. Portanto, a representação binária de π é calculada da esquerda para a direita da seguinte maneira:

    onde p é a precisão (24 neste exemplo), n é a posição do bit do significando da esquerda (começando em 0 e terminando em 23 aqui) e e é o expoente (1 neste exemplo).

    Pode ser necessário que o dígito mais significativo do significando de um número diferente de zero seja diferente de zero (exceto quando o expoente correspondente for menor que o mínimo). Este processo é chamado normalização. Para formatos binários (que usa apenas os dígitos 0 e 1), esse dígito diferente de zero é necessariamente 1. Portanto, não precisa ser representado na memória permitindo que o formato tenha mais um bit de precisão. Esta regra é chamada de convenção de bits principais, a convenção de bits implícita, a convenção de bits escondidos, [4] ou o convenção de bits assumida.

    Alternativas para números de ponto flutuante Editar

    A representação de ponto flutuante é de longe a forma mais comum de representar em computadores uma aproximação de números reais. No entanto, existem alternativas:

      representação usa operações de hardware inteiras controladas por uma implementação de software de uma convenção específica sobre a localização do ponto binário ou decimal, por exemplo, 6 bits ou dígitos da direita. O hardware para manipular essas representações é menos caro do que o ponto flutuante e também pode ser usado para realizar operações normais de inteiros. O ponto fixo binário é geralmente usado em aplicativos de propósito especial em processadores incorporados que só podem fazer aritmética de inteiros, mas o ponto fixo decimal é comum em aplicativos comerciais. (LNSs) representam um número real pelo logaritmo de seu valor absoluto e um bit de sinal. A distribuição de valor é semelhante ao ponto flutuante, mas a curva de valor para representação (ou seja,, o gráfico da função de logaritmo) é suave (exceto em 0). Ao contrário da aritmética de ponto flutuante, em um sistema de número logarítmico, a multiplicação, a divisão e a exponenciação são simples de implementar, mas a adição e a subtração são complexas. A aritmética de índice de nível (simétrica) (LI e SLI) de Charles Clenshaw, Frank Olver e Peter Turner é um esquema baseado em uma representação logarítmica generalizada. , que não parece ser usado na prática.
    • Onde maior precisão é desejada, aritmética de ponto flutuante pode ser implementada (normalmente em software) com significandos de comprimento variável (e às vezes expoentes) que são dimensionados dependendo da necessidade real e dependendo de como o cálculo prossegue. Isso é chamado de aritmética de ponto flutuante de precisão arbitrária.
    • As expansões de ponto flutuante são outra maneira de obter uma maior precisão, beneficiando-se do hardware de ponto flutuante: um número é representado como uma soma não avaliada de vários números de ponto flutuante. Um exemplo é a aritmética double-double, às vezes usada para o tipo C long double.
    • Alguns números racionais simples (por exemplo., 1/3 e 1/10) não podem ser representados exatamente em ponto flutuante binário, independentemente da precisão. Usar um radical diferente permite representar alguns deles (por exemplo., 1/10 em ponto flutuante decimal), mas as possibilidades permanecem limitadas. Os pacotes de software que realizam aritmética racional representam números como frações com numerador e denominador inteiros e, portanto, podem representar qualquer número racional com exatidão. Esses pacotes geralmente precisam usar aritmética "bignum" para os inteiros individuais. permite representar números como intervalos e obter limites garantidos nos resultados.É geralmente baseado em outras aritméticas, em particular ponto flutuante. como Mathematica, Maxima e Maple muitas vezes podem lidar com números irracionais como π < displaystyle pi> ou 3 < displaystyle < sqrt <3> >> de uma forma completamente "formal", sem lidar com uma codificação específica do significando. Tal programa pode avaliar expressões como "sin ⁡ (3 π) < displaystyle sin (3 pi)>" exatamente, porque é programado para processar a matemática subjacente diretamente, em vez de usar valores aproximados para cada cálculo intermediário.

    Edição de História

    Em 1914, Leonardo Torres y Quevedo projetou uma versão eletromecânica da Máquina Analítica de Charles Babbage e incluiu a aritmética de ponto flutuante. [8] Em 1938, Konrad Zuse de Berlim completou o Z1, o primeiro computador mecânico programável binário [9] que usa uma representação de número de ponto flutuante binário de 24 bits com um expoente com sinal de 7 bits, um significando de 17 bits ( incluindo um bit implícito) e um bit de sinal. [10] O Z3 baseado em relé mais confiável, concluído em 1941, tem representações para infinitos positivos e negativos em particular, ele implementa operações definidas com infinito, como 1 / ∞ = 0 < displaystyle ^ <1> / _ < infty> = 0> e para em operações indefinidas, como 0 × ∞ < displaystyle 0 times infty>.

    Zuse também propôs, mas não completou, aritmética de ponto flutuante cuidadosamente arredondada que inclui ± ∞ < displaystyle pm infty> e representações NaN, antecipando recursos do Padrão IEEE em quatro décadas. [11] Em contraste, von Neumann recomendou contra números de ponto flutuante para a máquina IAS 1951, argumentando que a aritmética de ponto fixo é preferível. [11]

    O primeiro comercial O computador com hardware de ponto flutuante foi o computador Z4 de Zuse, projetado em 1942-1945. Em 1946, Bell Laboratories introduziu o Mark V, que implementou números de ponto flutuante decimal. [12]

    O Pilot ACE possui aritmética de ponto flutuante binário e tornou-se operacional em 1950 no National Physical Laboratory, no Reino Unido. Mais tarde, trinta e três foram vendidos comercialmente como o English Electric DEUCE. A aritmética é, na verdade, implementada em software, mas com uma taxa de clock de um megahertz, a velocidade das operações de ponto flutuante e de ponto fixo nesta máquina era inicialmente mais rápida do que a de muitos computadores concorrentes.

    O IBM 704 produzido em massa, seguido em 1954, introduziu o uso de um expoente tendencioso. Por muitas décadas depois disso, o hardware de ponto flutuante era normalmente um recurso opcional, e os computadores que o possuíam eram considerados "computadores científicos" ou tinham capacidade de "computação científica" (SC) (consulte também Extensões para Computação Científica (XSC )). Não foi até o lançamento do Intel i486 em 1989 que propósito geral os computadores pessoais têm capacidade de ponto flutuante no hardware como um recurso padrão.

    A série UNIVAC 1100/2200, introduzida em 1962, suportava duas representações de ponto flutuante:

    • Precisão simples: 36 bits, organizado como um sinal de 1 bit, um expoente de 8 bits e um significando de 27 bits.
    • Dupla precisão: 72 bits, organizado como um sinal de 1 bit, um expoente de 11 bits e um significando de 60 bits.

    O IBM 7094, também lançado em 1962, suporta representações de precisão simples e dupla, mas sem relação com as representações do UNIVAC. De fato, em 1964, a IBM introduziu representações de ponto flutuante hexadecimal em seus mainframes System / 360, essas mesmas representações ainda estão disponíveis para uso em sistemas z / Architecture modernos. No entanto, em 1998, a IBM incluiu a aritmética de ponto flutuante binário compatível com IEEE em seus mainframes. Em 2005, a IBM também adicionou a aritmética de ponto flutuante decimal compatível com IEEE.

    Inicialmente, os computadores usavam muitas representações diferentes para números de ponto flutuante. A falta de padronização no nível do mainframe era um problema contínuo no início dos anos 1970 para aqueles que escreviam e mantinham o código-fonte de nível superior. Esses padrões de ponto flutuante do fabricante diferiam no tamanho das palavras, nas representações e no comportamento de arredondamento e na precisão geral das operações . A compatibilidade de ponto flutuante em vários sistemas de computação precisava desesperadamente de padronização no início da década de 1980, levando à criação do padrão IEEE 754 quando a palavra de 32 bits (ou 64 bits) se tornou comum. Este padrão foi significativamente baseado em uma proposta da Intel, que estava projetando o coprocessador numérico i8087 da Motorola, que estava projetando o 68000 na mesma época, e também deu uma contribuição significativa.

    Em 1989, o matemático e cientista da computação William Kahan foi homenageado com o Prêmio Turing por ser o arquiteto principal por trás dessa proposta - ele foi auxiliado por seu aluno (Jerome Coonen) e um professor visitante (Harold Stone). [13]

    Entre as inovações do x86 estão estas:

    • Uma representação de ponto flutuante especificada com precisão no nível da string de bits, para que todos os computadores compatíveis interpretem os padrões de bits da mesma maneira. Isso possibilita a transferência precisa e eficiente de números de ponto flutuante de um computador para outro (após contabilizar o endianismo).
    • Um comportamento precisamente especificado para as operações aritméticas: um resultado deve ser produzido como se uma aritmética infinitamente precisa fosse usada para produzir um valor que é então arredondado de acordo com regras específicas. Isso significa que um programa de computador compatível sempre produziria o mesmo resultado quando dado uma entrada particular, mitigando assim a reputação quase mística que a computação de ponto flutuante havia desenvolvido por seu comportamento até então aparentemente não determinístico.
    • A capacidade de condições excepcionais (estouro, divisão por zero, etc.) de se propagar por meio de um cálculo de maneira benigna e, então, serem tratadas pelo software de maneira controlada.

    Um número de ponto flutuante consiste em dois componentes de ponto fixo, cujo alcance depende exclusivamente do número de bits ou dígitos em sua representação. Enquanto os componentes dependem linearmente de seu intervalo, o intervalo de ponto flutuante depende linearmente do intervalo do significando e exponencialmente do intervalo do componente expoente, que atribui um intervalo incrivelmente mais amplo ao número.

    Em um sistema de computador típico, um dupla precisão (64 bits) o número de ponto flutuante binário tem um coeficiente de 53 bits (incluindo 1 bit implícito), um expoente de 11 bits e 1 bit de sinal. Como 2 10 = 1024, o intervalo completo dos números de ponto flutuante normais positivos neste formato é de 2 −1022 ≈ 2 × 10 −308 a aproximadamente 2 1024 ≈ 2 × 10 308.

    O número de números de ponto flutuante normalizados em um sistema (B, P, eu, você) Onde

    • B é a base do sistema,
    • P é a precisão do significando (na base B),
    • eu é o menor expoente do sistema,
    • você é o maior expoente do sistema,

    Há um menor número de ponto flutuante normalizado positivo,

    Nível de underflow = UFL = B L < displaystyle B ^> ,

    que tem 1 como dígito inicial e 0 para os dígitos restantes do significando, e o menor valor possível para o expoente.

    Há um maior número de ponto flutuante,

    que tem B - 1 como o valor para cada dígito do significando e o maior valor possível para o expoente.

    Além disso, existem valores representáveis ​​estritamente entre −UFL e UFL. Ou seja, zeros positivos e negativos, bem como números desnormalizados.

    O IEEE padronizou a representação de computador para números de ponto flutuante binários no IEEE 754 (também conhecido como IEC 60559) em 1985. Este primeiro padrão é seguido por quase todas as máquinas modernas. Ele foi revisado em 2008. Os mainframes IBM suportam o formato de ponto flutuante hexadecimal da IBM e ponto flutuante decimal IEEE 754-2008, além do formato binário IEEE 754. A série Cray T90 tinha uma versão IEEE, mas o SV1 ainda usa o formato de ponto flutuante Cray. [ citação necessária ]

    O padrão fornece muitos formatos intimamente relacionados, diferindo apenas em alguns detalhes. Cinco desses formatos são chamados formatos básicos, e outros são denominados formatos de precisão estendidos e formato de precisão extensível. Três formatos são especialmente amplamente usados ​​em hardware e linguagens de computador: [ citação necessária ]

      (binary32), geralmente usado para representar o tipo "float" na família da linguagem C (embora isso não seja garantido). É um formato binário que ocupa 32 bits (4 bytes) e seu significando tem uma precisão de 24 bits (cerca de 7 dígitos decimais). (binary64), geralmente usado para representar o tipo "duplo" na família da linguagem C (embora isso não seja garantido). É um formato binário que ocupa 64 bits (8 bytes) e seu significando tem uma precisão de 53 bits (cerca de 16 dígitos decimais). , também denominado ambiguamente formato de "precisão estendida". Este é um formato binário que ocupa pelo menos 79 bits (80 se a regra de bits ocultos / implícitos não for usada) e seu significando tem uma precisão de pelo menos 64 bits (cerca de 19 dígitos decimais). Os padrões C99 e C11 da família de linguagem C, em seu anexo F ("aritmética de ponto flutuante IEC 60559"), recomendam que esse formato estendido seja fornecido como "duplo longo". [14] Um formato que satisfaça os requisitos mínimos (precisão do significando de 64 bits, expoente de 15 bits, portanto cabendo em 80 bits) é fornecido pela arquitetura x86. Freqüentemente, em tais processadores, este formato pode ser usado com "long double", embora a precisão estendida não esteja disponível com MSVC. Para fins de alinhamento, muitas ferramentas armazenam esse valor de 80 bits em um espaço de 96 ou 128 bits. [15] [16] Em outros processadores, "long double" pode significar um formato maior, como precisão quádrupla, [17] ou apenas precisão dupla, se qualquer forma de precisão estendida não estiver disponível. [18]

    Aumentar a precisão da representação de ponto flutuante geralmente reduz a quantidade de erro de arredondamento acumulado causado por cálculos intermediários. [19] Os formatos IEEE menos comuns incluem:

      (binário128). É um formato binário que ocupa 128 bits (16 bytes) e seu significando tem uma precisão de 113 bits (cerca de 34 dígitos decimais). e formatos de ponto flutuante decimal 128. Esses formatos, junto com o formato decimal32, destinam-se a realizar o arredondamento decimal corretamente. , também chamado de binary16, um valor de ponto flutuante de 16 bits. Ele está sendo usado na linguagem gráfica NVIDIA Cg e no padrão openEXR. [20]

    Qualquer inteiro com valor absoluto menor que 2 24 pode ser representado exatamente no formato de precisão única, e qualquer inteiro com valor absoluto menor que 2 53 pode ser representado exatamente no formato de precisão dupla. Além disso, uma ampla gama de potências de 2 vezes esse número pode ser representada. Essas propriedades às vezes são usadas para dados puramente inteiros, para obter inteiros de 53 bits em plataformas que têm flutuações de precisão dupla, mas apenas inteiros de 32 bits.

    O padrão especifica alguns valores especiais e sua representação: infinito positivo (+ ∞), infinito negativo (−∞), um zero negativo (−0) distinto do zero comum ("positivo") e valores "não numéricos" ( NaNs).

    A comparação de números de ponto flutuante, conforme definido pelo padrão IEEE, é um pouco diferente da comparação normal de inteiros. Zero negativo e positivo são comparados iguais, e todo NaN é diferente para todos os valores, incluindo ele mesmo. Todos os números de ponto flutuante finitos são estritamente menores que + ∞ e estritamente maiores que −∞, e são ordenados da mesma maneira que seus valores (no conjunto de números reais).

    Edição de representação interna

    Os números de ponto flutuante são tipicamente compactados em um datum de computador como o bit de sinal, o campo de expoente e o significando ou mantissa, da esquerda para a direita. Para os formatos binários IEEE 754 (básico e estendido) que possuem implementações de hardware existentes, eles são distribuídos da seguinte forma:

    Embora o expoente possa ser positivo ou negativo, em formatos binários ele é armazenado como um número sem sinal que tem um "viés" fixo adicionado a ele. Os valores de todos os 0s neste campo são reservados para os zeros e os valores dos números subnormais de todos os 1s são reservados para os infinitos e NaNs. O intervalo de expoentes para números normalizados é [−126, 127] para precisão simples, [−1022, 1023] para duplo ou [−16382, 16383] para quad. Os números normalizados excluem valores subnormais, zeros, infinitos e NaNs.

    Nos formatos de intercâmbio binário IEEE, o bit 1 inicial de um significando normalizado não é realmente armazenado no datum do computador. É denominado bit "oculto" ou "implícito". Por causa disso, o formato de precisão simples, na verdade, tem um significando com 24 bits de precisão, o formato de precisão dupla tem 53 e o quad tem 113.

    Por exemplo, foi mostrado acima que π, arredondado para 24 bits de precisão, tem:

    A soma da polarização do expoente (127) e do expoente (1) é 128, então isso é representado no formato de precisão única como

    Um exemplo de layout para ponto flutuante de 32 bits é

    Valores especiais Editar

    Edição zero assinada

    No padrão IEEE 754, o zero é sinalizado, o que significa que existe um "zero positivo" (+0) e um "zero negativo" (−0). Na maioria dos ambientes de tempo de execução, o zero positivo é geralmente impresso como "0" e o zero negativo como "-0". Os dois valores se comportam como iguais em comparações numéricas, mas algumas operações retornam resultados diferentes para +0 e -0. Por exemplo, 1 / (- 0) retorna infinito negativo, enquanto 1 / + 0 retorna infinito positivo (de forma que a identidade 1 / (1 / ± ∞) = ± ∞ seja mantida). Outras funções comuns com uma descontinuidade em x= 0 que pode tratar +0 e −0 de forma diferente incluem log (x), signum (x), e a raiz quadrada principal de y + XI para qualquer número negativo y. Como acontece com qualquer esquema de aproximação, as operações envolvendo "zero negativo" podem ocasionalmente causar confusão. Por exemplo, no IEEE 754, x = y nem sempre implica 1 /x = 1/y , como 0 = −0 mas 1/0 ≠ 1 / −0. [22]

    Edição de números subnormais

    Os valores subnormais preenchem a lacuna de underflow com valores onde a distância absoluta entre eles é a mesma que para valores adjacentes fora da lacuna de underflow. Esta é uma melhoria em relação à prática mais antiga para ter apenas zero no gap de underflow, e onde os resultados de underflowing foram substituídos por zero (nivelado a zero). [4]

    O hardware de ponto flutuante moderno geralmente lida com valores subnormais (bem como valores normais) e não requer emulação de software para subnormais.

    Infinities Edit

    Os infinitos da linha de número real estendida podem ser representados em tipos de dados de ponto flutuante IEEE, assim como valores de ponto flutuante comuns como 1, 1,5, etc. Eles não são valores de erro de forma alguma, embora sejam frequentemente (mas nem sempre, pois depende do arredondamento) usado como valores de reposição quando há um estouro. Em uma exceção de divisão por zero, um infinito positivo ou negativo é retornado como um resultado exato. Um infinito também pode ser introduzido como um numeral (como a macro "INFINITY" do C ou "∞" se a linguagem de programação permitir essa sintaxe).

    IEEE 754 requer que infinitos sejam tratados de uma forma razoável, como

    Edição NaNs

    O IEEE 754 especifica um valor especial denominado "Não é um número" (NaN) a ser retornado como resultado de certas operações "inválidas", como 0/0, ∞ × 0 ou sqrt (−1). Em geral, os NaNs serão propagados, isto é, a maioria das operações envolvendo um NaN resultará em um NaN, embora funções que dariam algum resultado definido para qualquer valor de ponto flutuante dado o farão também para NaNs, por ex. NaN ^ 0 = 1. Existem dois tipos de NaNs: o padrão quieto NaNs e, opcionalmente, sinalização NaNs. Uma sinalização NaN em qualquer operação aritmética (incluindo comparações numéricas) fará com que uma exceção de "operação inválida" seja sinalizada.

    A representação de NaNs especificada pelo padrão tem alguns bits não especificados que podem ser usados ​​para codificar o tipo ou fonte de erro, mas não existe um padrão para essa codificação. Em teoria, os NaNs de sinalização poderiam ser usados ​​por um sistema de tempo de execução para sinalizar variáveis ​​não inicializadas ou estender os números de ponto flutuante com outros valores especiais sem diminuir os cálculos com valores comuns, embora tais extensões não sejam comuns.

    IEEE 754 design racional Editar

    É um equívoco comum que os recursos mais esotéricos do padrão IEEE 754 discutidos aqui, como formatos estendidos, NaN, infinitos, subnormais, etc., são de interesse apenas para analistas numéricos, ou para aplicações numéricas avançadas, de fato, o oposto é verdadeiro : esses recursos são projetados para fornecer padrões robustos e seguros para programadores numericamente não sofisticados, além de oferecer suporte a bibliotecas numéricas sofisticadas por especialistas. O designer-chave do IEEE 754, William Kahan observa que é incorreto ". [Considerar] características do padrão IEEE 754 para aritmética binária de ponto flutuante que. [São] consideradas como características utilizáveis ​​por ninguém, exceto especialistas numéricos. Os fatos são exatamente o oposto. Em 1977, esses recursos foram desenvolvidos no Intel 8087 para atender ao mais amplo mercado possível. A análise de erros nos diz como projetar aritmética de ponto flutuante, como o padrão IEEE 754, moderadamente tolerante à ignorância bem-intencionada entre os programadores " . [23]

    • Os valores especiais como infinito e NaN garantem que a aritmética de ponto flutuante seja algebricamente completa: cada operação de ponto flutuante produz um resultado bem definido e não irá - por padrão - lançar uma interrupção ou trap da máquina. Além disso, as escolhas de valores especiais retornados em casos excepcionais foram projetadas para fornecer a resposta correta em muitos casos. Por exemplo, sob a aritmética IEEE 754, frações contínuas como R (z): = 7 - 3 / [z - 2 - 1 / (z - 7 + 10 / [z - 2 - 2 / (z - 3)]) ] dará a resposta correta em todas as entradas, como a divisão potencial por zero, por exemplo para z = 3, é manipulado corretamente fornecendo + infinito e, portanto, tais exceções podem ser ignoradas com segurança. [24] Conforme observado por Kahan, a armadilha não tratada consecutiva para um estouro de conversão de ponto flutuante para inteiro de 16 bits que causou a perda de um foguete Ariane 5 não teria acontecido sob a política de ponto flutuante IEEE 754 padrão. [23]
    • Números subnormais garantem que para finito números de ponto flutuante xey, x - y = 0 se e somente se x = y, como esperado, mas que não se aplicava às representações de ponto flutuante anteriores. [13]
    • Sobre a lógica do design do formato x87 de 80 bits, Kahan observa: "Este formato estendido foi projetado para ser usado, com perda desprezível de velocidade, para todos, exceto a aritmética mais simples com flutuante e operandos duplos. Por exemplo, ele deve ser usado para variáveis ​​scratch em loops que implementam recorrências como avaliação polinomial, produtos escalares, frações parciais e contínuas. Freqüentemente, evita Over / Underflow prematuro ou cancelamento local severo que pode estragar algoritmos simples ".[25] A computação de resultados intermediários em um formato estendido com alta precisão e expoente estendido tem precedentes na prática histórica de cálculo científico e no projeto de calculadoras científicas, por exemplo, As calculadoras financeiras da Hewlett-Packard executavam funções aritméticas e financeiras em três casas decimais mais significativas do que armazenavam ou exibiam. [25] A implementação da precisão estendida permitiu que bibliotecas de funções elementares padrão fossem prontamente desenvolvidas, que normalmente forneciam resultados de precisão dupla dentro de uma unidade no último lugar (ULP) em alta velocidade.
    • O arredondamento correto dos valores para o valor representável mais próximo evita vieses sistemáticos nos cálculos e retarda o crescimento dos erros. Arredondar os laços para par remove o viés estatístico que pode ocorrer na adição de números semelhantes.
    • O arredondamento dirigido foi concebido como um auxílio na verificação de limites de erro, por exemplo, na aritmética de intervalo. Também é usado na implementação de algumas funções.
    • A base matemática das operações, em particular o arredondamento correto, permite provar propriedades matemáticas e projetar algoritmos de ponto flutuante, como 2Sum, Fast2Sum e algoritmo de soma Kahan, por ex. para melhorar a precisão ou implementar sub-rotinas aritméticas de precisão múltipla com relativa facilidade.

    Uma propriedade dos formatos de precisão simples e dupla é que sua codificação permite classificá-los facilmente sem usar hardware de ponto flutuante. Seus bits interpretados como um número inteiro de complemento de dois já classificam os positivos corretamente, com os negativos invertidos. Com um xor para inverter o bit de sinal para valores positivos e todos os bits para valores negativos, todos os valores se tornam classificáveis ​​como inteiros sem sinal (com -0 & lt +0). [26] Não está claro se esta propriedade é pretendida.

    Além dos formatos padrão IEEE 754 amplamente usados, outros formatos de ponto flutuante são usados, ou têm sido usados, em certas áreas específicas de domínio.

    • O Microsoft Binary Format (MBF) foi desenvolvido para os produtos de linguagem Microsoft BASIC, incluindo o primeiro produto da Microsoft, o Altair BASIC (1975), TRS-80 LEVEL II, MBASIC do CP / M, BASICA do IBM PC 5150, GW-BASIC do MS-DOS e QuickBASIC anteriores à versão 4.00. QuickBASIC versão 4.00 e 4.50 mudou para o formato IEEE 754-1985, mas pode reverter para o formato MBF usando a opção de comando / MBF. MBF foi projetado e desenvolvido em um Intel 8080 simulado por Monte Davidoff, um dormmate de Bill Gates, durante a primavera de 1975 para o MITS Altair 8800. O lançamento inicial de julho de 1975 suportava um formato de precisão única (32 bits) devido ao custo de a memória de 4 kilobytes do MITS Altair 8800. Em dezembro de 1975, a versão de 8 kilobytes adicionou um formato de precisão dupla (64 bits). Um formato de variante de precisão única (40 bits) foi adotado para outros CPUs, notavelmente o MOS 6502 (Apple //, Commodore PET, Atari), Motorola 6800 (MITS Altair 680) e Motorola 6809 (TRS-80 Color Computer). Todos os produtos de idioma da Microsoft de 1975 a 1987 usavam o Formato Binário da Microsoft até que a Microsoft adotasse o formato padrão IEEE-754 em todos os seus produtos, a partir de 1988 até seus lançamentos atuais. O MBF consiste no formato de precisão única do MBF (32 bits, "BASIC de 6 dígitos"), [27] [28] no formato de precisão estendida do MBF (40 bits, "BASIC de 9 dígitos"), [28] e o Formato de precisão dupla MBF (64 bits) [27] [29] cada um deles é representado com um expoente de 8 bits, seguido por um bit de sinal, seguido por um significando de, respectivamente, 23, 31 e 55 bits.
    • O formato Bfloat16 requer a mesma quantidade de memória (16 bits) que o formato de meia precisão IEEE 754, mas aloca 8 bits para o expoente em vez de 5, fornecendo assim o mesmo intervalo de um número de precisão única IEEE 754. A compensação é uma precisão reduzida, pois o campo de significando à direita é reduzido de 10 para 7 bits. Esse formato é usado principalmente no treinamento de modelos de aprendizado de máquina, onde o alcance é mais valioso do que a precisão. Muitos aceleradores de aprendizado de máquina fornecem suporte de hardware para este formato.
    • O formato TensorFloat-32 [30] fornece o melhor dos formatos Bfloat16 e de meia precisão, tendo 8 bits de expoente como o primeiro e 10 bits de campo de significando à direita como o último. Este formato foi introduzido pela Nvidia, que fornece suporte de hardware para ele nos Tensor Cores de suas GPUs com base na arquitetura Nvidia Ampere. A desvantagem desse formato é seu tamanho total de 19 bits, que não é uma potência de 2. No entanto, de acordo com a Nvidia, este formato só deve ser usado internamente pelo hardware para acelerar os cálculos, enquanto as entradas e saídas devem ser armazenadas no Formato IEEE 754 de precisão única de 32 bits. [30]

    Por sua natureza, todos os números expressos em formato de ponto flutuante são números racionais com uma expansão final na base relevante (por exemplo, uma expansão decimal final na base 10 ou uma expansão binária final na base 2). Números irracionais, como π ou √2, ou números racionais sem terminação, devem ser aproximados. O número de dígitos (ou bits) de precisão também limita o conjunto de números racionais que podem ser representados exatamente. Por exemplo, o número decimal 123456789 não pode ser representado exatamente se apenas oito dígitos decimais de precisão estiverem disponíveis (seria arredondado para 123456790 ou 123456780 onde o dígito mais à direita 0 não é explicitamente representado), o mesmo se aplica a dígitos sem terminação (. 5 para ser arredondado para 0,55555555 ou 0,55555556).

    Quando um número é representado em algum formato (como uma sequência de caracteres) que não é uma representação de ponto flutuante nativa com suporte em uma implementação de computador, ele exigirá uma conversão antes de poder ser usado nessa implementação. Se o número puder ser representado exatamente no formato de ponto flutuante, a conversão é exata. Se não houver uma representação exata, a conversão requer a escolha de qual número de ponto flutuante usar para representar o valor original. A representação escolhida terá um valor diferente do original, e o valor assim ajustado é denominado de valor arredondado.

    Se um número racional tem ou não uma expansão final depende da base. Por exemplo, na base 10, o número 1/2 tem uma expansão de terminação (0,5), enquanto o número 1/3 não (0,333.). Na base 2, apenas os racionais com denominadores que são potências de 2 (como 1/2 ou 3/16) estão terminando. Qualquer racional com um denominador que tenha um fator primo diferente de 2 terá uma expansão binária infinita. Isso significa que os números que parecem curtos e exatos quando escritos em formato decimal podem precisar ser aproximados quando convertidos para ponto flutuante binário. Por exemplo, o número decimal 0,1 não é representável em ponto flutuante binário de qualquer precisão finita, a representação binária exata teria uma sequência "1100" continuando indefinidamente:

    e = −4 s = 1100110011001100110011001100110011.

    onde, como anteriormente, s é o significando e e é o expoente.

    Quando arredondado para 24 bits, torna-se

    e = −4 s = 110011001100110011001101,

    que é, na verdade, 0,100000001490116119384765625 em decimal.

    Como outro exemplo, o número real π, representado em binário como uma sequência infinita de bits é

    quando aproximado por arredondamento para uma precisão de 24 bits.

    Em ponto flutuante binário de precisão simples, isso é representado como s = 1.10010010000111111011011 com e = 1. Tem um valor decimal de

    3.1415927410125732421875,

    enquanto uma aproximação mais precisa do valor verdadeiro de π é

    3.14159265358979323846264338327950.

    O resultado do arredondamento difere do valor verdadeiro em cerca de 0,03 partes por milhão e corresponde à representação decimal de π nos primeiros 7 dígitos. A diferença é o erro de discretização e é limitada pelo épsilon da máquina.

    A diferença aritmética entre dois números de ponto flutuante representáveis ​​consecutivos que têm o mesmo expoente é chamada de unidade na última posição (ULP). Por exemplo, se não houver um número representável entre os números representáveis ​​1.45a70c22hex e 1.45a70c24hex, o ULP é 2 × 16 −8 ou 2 −31. Para números com um expoente de base 2 parte de 0, ou seja, números com um valor absoluto maior ou igual a 1, mas menor que 2, um ULP é exatamente 2 −23 ou cerca de 10 −7 em precisão única e exatamente 2 −53 ou cerca de 10 −16 em precisão dupla. O comportamento obrigatório do hardware compatível com IEEE é que o resultado esteja dentro da metade de um ULP.

    Modos de arredondamento Editar

    O arredondamento é usado quando o resultado exato de uma operação de ponto flutuante (ou uma conversão para o formato de ponto flutuante) precisaria de mais dígitos do que há dígitos no significando. IEEE 754 requer arredondamento correto: isto é, o resultado arredondado é como se a aritmética infinitamente precisa fosse usada para calcular o valor e depois arredondado (embora na implementação apenas três bits extras sejam necessários para garantir isso). Existem vários esquemas de arredondamento diferentes (ou modos de arredondamento) Historicamente, o truncamento era a abordagem típica. Desde a introdução do IEEE 754, o método padrão (volta para o mais próximo, empata para o par, às vezes chamado de Banker's Rounding) é mais comumente usado. Esse método arredonda o resultado ideal (infinitamente preciso) de uma operação aritmética para o valor representável mais próximo e fornece essa representação como resultado. [nota 8] Em caso de empate, é escolhido o valor que faria com que o significando terminasse em um dígito par. O padrão IEEE 754 requer que o mesmo arredondamento seja aplicado a todas as operações algébricas fundamentais, incluindo raiz quadrada e conversões, quando há um resultado numérico (não NaN). Isso significa que os resultados das operações IEEE 754 são completamente determinados em todos os bits do resultado, exceto para a representação de NaNs. (As funções de "biblioteca", como cosseno e registro, não são obrigatórias.)

    Opções alternativas de arredondamento também estão disponíveis. IEEE 754 especifica os seguintes modos de arredondamento:

    • arredondar para o mais próximo, onde os empates são arredondados para o dígito par mais próximo na posição necessária (o padrão e de longe o modo mais comum)
    • arredondar para o mais próximo, onde os empates se distanciam de zero (opcional para ponto flutuante binário e comumente usado em decimal)
    • arredondar para cima (para + ∞ resultados negativos, portanto, arredondar para zero)
    • arredondar para baixo (em direção a −∞ resultados negativos, portanto, arredondar para longe de zero)
    • arredondar para zero (o truncamento é semelhante ao comportamento comum de conversões float-para-inteiro, que convertem −3,9 para −3 e 3,9 para 3)

    Os modos alternativos são úteis quando a quantidade de erro que está sendo introduzida deve ser limitada. Os aplicativos que requerem um erro limitado são de ponto flutuante de precisão múltipla e aritmética de intervalo. Os modos de arredondamento alternativos também são úteis no diagnóstico de instabilidade numérica: se os resultados de uma sub-rotina variam substancialmente entre o arredondamento para + e - infinito, então é provável que seja numericamente instável e afetado por erro de arredondamento. [31]

    Conversão de binário para decimal com número mínimo de dígitos Editar

    Converter um número de ponto flutuante binário de precisão dupla em uma string decimal é uma operação comum, mas um algoritmo que produz resultados precisos e mínimos não apareceu na impressão até 1990, com Steele e White's Dragon4. Algumas das melhorias desde então incluem:

    • David M. Gay's dtoa.c, uma implementação prática de código aberto de muitas ideias no Dragon4. [32]
    • Grisu3, com aumento de 4 ×, pois elimina o uso de bignums. Deve ser usado com um substituto, pois falha para

    Muitos tempos de execução de linguagem modernos usam Grisu3 com um fallback Dragon4. [36]

    Edição de conversão decimal para binário

    O problema de analisar uma string decimal em uma representação binária de FP é complexo, com um analisador preciso não aparecendo até o trabalho de Clinger em 1990 (implementado em dtoa.c). [32] Outros trabalhos também progrediram na direção de uma análise mais rápida. [37]

    Para facilidade de apresentação e compreensão, a raiz decimal com precisão de 7 dígitos será usada nos exemplos, como no IEEE 754 decimal32 formato. Os princípios fundamentais são os mesmos em qualquer raiz ou precisão, exceto que a normalização é opcional (não afeta o valor numérico do resultado). Aqui, s denota o significando e e denota o expoente.

    Edição de adição e subtração

    Um método simples para adicionar números de ponto flutuante é primeiro representá-los com o mesmo expoente. No exemplo abaixo, o segundo número é deslocado para a direita em três dígitos e um prossegue com o método de adição usual:

    Este é o resultado verdadeiro, a soma exata dos operandos. Ele será arredondado para sete dígitos e depois normalizado, se necessário. O resultado final é

    Os três dígitos mais baixos do segundo operando (654) são essencialmente perdidos. Este é um erro de arredondamento. Em casos extremos, a soma de dois números diferentes de zero pode ser igual a um deles:

    Nos exemplos conceituais acima, pareceria que um grande número de dígitos extras precisaria ser fornecido pelo somador para garantir o arredondamento correto, no entanto, para adição ou subtração binária usando técnicas de implementação cuidadosas apenas um guarda um pouco arredondamento bit e um extra pegajoso bit precisa ser transportado além da precisão dos operandos. [22] [38]: 218-220

    Outro problema de perda de significância ocorre quando aproximações a dois números quase iguais são subtraídos. No exemplo a seguir e = 5 s = 1,234571 e e = 5 s = 1,234567 são aproximações dos racionais 123457,1467 e 123456,659.

    A diferença de ponto flutuante é calculada exatamente porque os números estão próximos - o lema de Sterbenz garante isso, mesmo em caso de underflow quando o underflow gradual é suportado. Apesar disso, a diferença dos números originais é e = −1 s = 4,877000, o que difere mais de 20% da diferença e = −1 s = 4.000000 das aproximações. Em casos extremos, todos os dígitos significativos de precisão podem ser perdidos. [22] [39] Este cancelamento ilustra o perigo de assumir que todos os dígitos de um resultado calculado são significativos. Lidar com as consequências desses erros é um tópico da análise numérica, consulte também Problemas de precisão.

    Edição de multiplicação e divisão

    Para multiplicar, os significandos são multiplicados enquanto os expoentes são adicionados, e o resultado é arredondado e normalizado.

    Da mesma forma, a divisão é realizada subtraindo o expoente do divisor do expoente do dividendo e dividindo o significando do dividendo pelo significando do divisor.

    Não há problemas de cancelamento ou absorção com multiplicação ou divisão, embora pequenos erros possam se acumular conforme as operações são realizadas em sucessão. [22] Na prática, a forma como essas operações são realizadas na lógica digital pode ser bastante complexa (consulte o algoritmo de multiplicação de Booth e o algoritmo de divisão). [nota 9] Para um método rápido e simples, consulte o método de Horner.

    A computação de ponto flutuante em um computador pode apresentar três tipos de problemas:

    • Uma operação pode ser indefinida matematicamente, como ∞ / ∞, ou divisão por zero.
    • Uma operação pode ser legal em princípio, mas não suportada pelo formato específico, por exemplo, calcular a raiz quadrada de -1 ou o seno inverso de 2 (ambos resultando em números complexos).
    • Uma operação pode ser legal em princípio, mas o resultado pode ser impossível de representar no formato especificado, porque o expoente é muito grande ou muito pequeno para ser codificado no campo do expoente. Esse evento é chamado de estouro (expoente muito grande), estouro negativo (expoente muito pequeno) ou desnormalização (perda de precisão).

    Antes do padrão IEEE, essas condições geralmente faziam com que o programa fosse encerrado ou disparassem algum tipo de armadilha que o programador poderia capturar. O modo como isso funcionava dependia do sistema, o que significa que os programas de ponto flutuante não eram portáteis. (O termo "exceção", conforme usado no IEEE 754, é um termo geral que significa uma condição excepcional, que não é necessariamente um erro, e é um uso diferente daquele normalmente definido em linguagens de programação como C ++ ou Java, em que um " exceção "é um fluxo alternativo de controle, mais próximo do que é denominado" armadilha "na terminologia IEEE 754).

    Aqui, o método padrão necessário de tratamento de exceções de acordo com IEEE 754 é discutido (o trapping opcional IEEE 754 e outros modos de "tratamento de exceção alternativo" não são discutidos). As exceções aritméticas são (por padrão) necessárias para serem registradas em bits de sinalizador de status "aderentes". O fato de serem "fixos" significa que não são redefinidos na próxima operação (aritmética), mas permanecem definidos até que sejam redefinidos explicitamente. O uso de sinalizadores "aderentes" permite, portanto, que o teste de condições excepcionais seja atrasado até depois de uma expressão de ponto flutuante ou sub-rotina completa: sem eles, as condições excepcionais que não poderiam ser ignoradas exigiriam um teste explícito imediatamente após cada operação de ponto flutuante. Por padrão, uma operação sempre retorna um resultado de acordo com a especificação, sem interromper o cálculo. Por exemplo, 1/0 retorna + ∞, enquanto também configura o bit de sinalização de divisão por zero (este padrão de ∞ é projetado para retornar frequentemente um resultado finito quando usado em operações subsequentes e, portanto, ser ignorado com segurança).

    O padrão IEEE 754 original, entretanto, não recomendou operações para lidar com tais conjuntos de bits de sinalizador de exceção aritmética. Portanto, embora fossem implementados em hardware, inicialmente as implementações da linguagem de programação normalmente não forneciam um meio de acessá-los (além do assembler). Ao longo do tempo, alguns padrões de linguagem de programação (por exemplo, C99 / C11 e Fortran) foram atualizados para especificar métodos para acessar e alterar bits de sinalizador de status. A versão 2008 do padrão IEEE 754 agora especifica algumas operações para acessar e manipular os bits de sinalizador aritmético. O modelo de programação é baseado em um único encadeamento de execução e o uso deles por vários encadeamentos deve ser tratado por um meio fora do padrão (por exemplo, C11 especifica que os sinalizadores têm armazenamento local de encadeamento).

    IEEE 754 especifica cinco exceções aritméticas que devem ser registradas nos sinalizadores de status ("sticky bits"):

    • inexato, definido se o valor arredondado (e retornado) for diferente do resultado matematicamente exato da operação.
    • underflow, definido se o valor arredondado for minúsculo (conforme especificado em IEEE 754) e inexato (ou talvez limitado a se tiver perda de desnormalização, conforme a versão 1984 do IEEE 754), retornando um valor subnormal incluindo os zeros.
    • transbordar, definido se o valor absoluto do valor arredondado for muito grande para ser representado. Um valor infinito ou máximo finito é retornado, dependendo de qual arredondamento é usado.
    • divida por zero, definido se o resultado for infinito, dados operandos finitos, retornando um infinito, seja + ∞ ou −∞.
    • inválido, definido se um resultado com valor real não puder ser retornado, por exemplo sqrt (−1) ou 0/0, retornando um NaN silencioso.

    O valor de retorno padrão para cada uma das exceções é projetado para fornecer o resultado correto na maioria dos casos, de forma que as exceções possam ser ignoradas na maioria dos códigos. inexato retorna um resultado arredondado corretamente, e underflow retorna um valor pequeno desnormalizado e, portanto, quase sempre pode ser ignorado. [40] divida por zero retorna exatamente o infinito, que normalmente divide um número finito e dá zero, ou então dá um inválido exceção subsequentemente, se não, e, portanto, também pode ser normalmente ignorada. Por exemplo, a resistência efetiva de n resistores em paralelo (ver fig. 1) é dada por R tot = 1 / (1 / R 1 + 1 / R 2 + ⋯ + 1 / R n) < displaystyle R _ < text> = 1 / (1 / R_ <1> + 1 / R_ <2> + cdots + 1 / R_)>. Se um curto-circuito se desenvolver com R 1 < displaystyle R_ <1>> definido como 0, 1 / R 1 < displaystyle 1 / R_ <1>> retornará + infinito que dará um R t o t final < displaystyle R_> de 0, como esperado [41] (veja o exemplo de fração contínua da lógica de design IEEE 754 para outro exemplo).

    Transbordar e inválido exceções normalmente não podem ser ignoradas, mas não representam necessariamente erros: por exemplo, uma rotina de localização de raiz, como parte de sua operação normal, pode avaliar uma função transmitida em valores fora de seu domínio, retornando NaN e um inválido sinalizador de exceção a ser ignorado até encontrar um ponto de início útil. [40]

    O fato de que os números de ponto flutuante não podem representar precisamente todos os números reais, e que as operações de ponto flutuante não podem representar precisamente as operações aritméticas verdadeiras, leva a muitas situações surpreendentes. Isso está relacionado à precisão finita com a qual os computadores geralmente representam os números.

    Por exemplo, a não representabilidade de 0,1 e 0,01 (em binário) significa que o resultado da tentativa de elevar ao quadrado 0,1 não é 0,01 nem o número representável mais próximo dele. Na representação de 24 bits (precisão única), 0,1 (decimal) foi dado anteriormente como e = −4 s = 110011001100110011001101, que é

    Quadrar este número dá

    Quadrá-lo com hardware de ponto flutuante de precisão simples (com arredondamento) dá

    Mas o número representável mais próximo de 0,01 é

    Além disso, a não representabilidade de π (e π / 2) significa que uma tentativa de cálculo de tan (π / 2) não produzirá um resultado de infinito, nem mesmo estourará nos formatos de ponto flutuante usuais (assumindo uma precisão implementação de tan). Simplesmente não é possível para o hardware de ponto flutuante padrão tentar calcular tan (π / 2), porque π / 2 não pode ser representado exatamente. Este cálculo em C:

    dará um resultado de 16331239353195370.0. Na precisão simples (usando a função tanf), o resultado será −22877332.0.

    Da mesma forma, uma tentativa de cálculo de sin (π) não resultará em zero. O resultado será (aproximadamente) 0,1225 × 10 - 15 em precisão dupla ou −0,8742 × 10 - 7 em precisão simples. [nota 10]

    Embora a adição e multiplicação de ponto flutuante sejam ambas comutativas (uma + b = b + uma e uma × b = b × uma), eles não são necessariamente associativos. Isso é, (uma + b) + c não é necessariamente igual a uma + (b + c) Usando aritmética decimal significativa de 7 dígitos:

    Eles também não são necessariamente distributivos. Isso é, (uma + b) × c pode não ser o mesmo que uma × c + b × c:

    Além da perda de significância, incapacidade de representar números como π e 0,1 exatamente, e outras pequenas imprecisões, os seguintes fenômenos podem ocorrer:

      : a subtração de operandos quase iguais pode causar extrema perda de precisão. [42] [39] Quando subtraímos dois números quase iguais, definimos os dígitos mais significativos para zero, deixando-nos apenas com os dígitos insignificantes e mais errôneos. [4]: 124 Por exemplo, ao determinar uma derivada de uma função, a seguinte fórmula é usada:
    • As conversões em inteiros não são intuitivas: converter (63,0 / 9,0) em inteiros resulta em 7, mas converter (0,63 / 0,09) pode render 6. Isso ocorre porque as conversões geralmente truncam em vez de arredondar. As funções de piso e teto podem produzir respostas que estão um pouco fora do valor esperado intuitivamente.
    • Faixa de expoente limitada: os resultados podem transbordar gerando infinito ou underflow gerando um número subnormal ou zero. Nestes casos, a precisão será perdida.
    • O teste de divisão segura é problemático: verificar se o divisor não é zero não garante que uma divisão não estourará.
    • Testar a igualdade é problemático. Duas sequências computacionais que são matematicamente iguais podem muito bem produzir valores de ponto flutuante diferentes. [43]

    Edição de Incidentes

    • Em 25 de fevereiro de 1991, uma perda de significância em uma bateria de mísseis MIM-104 Patriot impediu-a de interceptar um míssil Scud de entrada em Dhahran, Arábia Saudita, contribuindo para a morte de 28 soldados do 14º Destacamento de Intendente do Exército dos EUA. [44]

    Precisão da máquina e análise de erro reverso Editar

    Precisão da máquina é uma quantidade que caracteriza a precisão de um sistema de ponto flutuante e é usada na análise de erros retroativos de algoritmos de ponto flutuante. Também é conhecido como arredondamento de unidade ou máquina epsilon. Normalmente denotado por Εmach, seu valor depende do arredondamento particular que está sendo usado.

    enquanto o arredondamento para o mais próximo,

    Isso é importante, pois limita o erro relativo na representação de qualquer número real diferente de zero x dentro do intervalo normalizado de um sistema de ponto flutuante:

    A análise de erros reversos, cuja teoria foi desenvolvida e popularizada por James H. Wilkinson, pode ser usada para estabelecer que um algoritmo que implementa uma função numérica é numericamente estável. [45] A abordagem básica é mostrar que embora o resultado calculado, devido a erros de arredondamento, não seja exatamente correto, é a solução exata para um problema próximo com dados de entrada levemente perturbados. Se a perturbação necessária for pequena, na ordem da incerteza nos dados de entrada, então os resultados são, em certo sentido, tão precisos quanto os dados "merecem". O algoritmo é então definido como estável para trás. Estabilidade é uma medida da sensibilidade a erros de arredondamento de um determinado procedimento numérico, por contraste, o número de condição de uma função para um determinado problema indica a sensibilidade inerente da função a pequenas perturbações em sua entrada e é independente da implementação usada para resolver o problema. [46]

    Como um exemplo trivial, considere uma expressão simples fornecendo o produto interno de (comprimento de dois) vetores x < displaystyle x> ey < displaystyle y>, então

    por definição, que é a soma de dois ligeiramente perturbados (na ordem de Εmach) dados de entrada e, portanto, é estável com versões anteriores. Para exemplos mais realistas em álgebra linear numérica, veja Higham 2002 [47] e outras referências abaixo.

    Minimizando o efeito dos problemas de precisão Editar

    Embora, conforme observado anteriormente, as operações aritméticas individuais do IEEE 754 tenham precisão garantida dentro da metade de um ULP, fórmulas mais complicadas podem sofrer erros maiores devido ao arredondamento. A perda de precisão pode ser substancial se um problema ou seus dados forem mal condicionados, o que significa que o resultado correto é hipersensível a pequenas perturbações em seus dados. No entanto, mesmo funções que são bem condicionadas podem sofrer grande perda de precisão se um algoritmo numericamente instável para esses dados for usado: formulações aparentemente equivalentes de expressões em uma linguagem de programação podem diferir marcadamente em sua estabilidade numérica. Uma abordagem para remover o risco de tal perda de precisão é o projeto e a análise de algoritmos numericamente estáveis, que é um objetivo do ramo da matemática conhecido como análise numérica. Outra abordagem que pode proteger contra o risco de instabilidades numéricas é o cálculo de valores intermediários (scratch) em um algoritmo com uma precisão maior do que o resultado final requer, [48] que pode remover ou reduzir em ordens de magnitude, [49] tal risco: a precisão quádrupla IEEE 754 e a precisão estendida são projetadas para essa finalidade ao computar com precisão dupla. [50] [nb 11]

    Por exemplo, o seguinte algoritmo é uma implementação direta para calcular a função A (x) = (x − 1) / (exp (x − 1) - 1) que é bem condicionado em 1.0, [nb 12] no entanto, pode ser mostrado como numericamente instável e perder até a metade dos dígitos significativos carregados pela aritmética quando calculado próximo a 1,0. [23]

    Se, no entanto, os cálculos intermediários são todos realizados em precisão estendida (por exemplo, definindo linha [1] para C99 longo duplo), então até a precisão total no resultado duplo final pode ser mantida. [nota 13] Alternativamente, uma análise numérica do algoritmo revela que se a seguinte mudança não óbvia na linha [2] for feita:

    então, o algoritmo se torna numericamente estável e pode calcular com precisão dupla total.

    Para manter as propriedades de tais programas numericamente estáveis ​​cuidadosamente construídos, é necessário um tratamento cuidadoso por parte do compilador. Certas "otimizações" que os compiladores podem fazer (por exemplo, operações de reordenamento) podem funcionar contra os objetivos de um software bem comportado. Há alguma controvérsia sobre as falhas dos compiladores e designs de linguagem nesta área: C99 é um exemplo de uma linguagem onde tais otimizações são cuidadosamente especificadas para manter a precisão numérica. Veja as referências externas no final deste artigo.

    Um tratamento detalhado das técnicas para escrever software de ponto flutuante de alta qualidade está além do escopo deste artigo, e o leitor é referido, [47] [51] e as outras referências no final deste artigo. Kahan sugere várias regras básicas que podem diminuir substancialmente em ordens de magnitude [51] o risco de anomalias numéricas, além de, ou no lugar de, uma análise numérica mais cuidadosa. Estes incluem: como observado acima, computar todas as expressões e resultados intermediários na mais alta precisão suportada no hardware (uma regra comum é transportar duas vezes a precisão do resultado desejado, ou seja, computar em precisão dupla para um resultado final de precisão única, ou em precisão dupla estendida ou quádrupla para resultados de precisão dupla [24]) e arredondamento de dados de entrada e resultados para apenas a precisão exigida e suportada pelos dados de entrada (transportando precisão em excesso no resultado final além do exigido e suportado pelo os dados de entrada podem ser enganosos, aumentam o custo de armazenamento e diminuem a velocidade, e os bits em excesso podem afetar a convergência dos procedimentos numéricos: [52] notavelmente, a primeira forma do exemplo iterativo dado abaixo converge corretamente ao usar esta regra prática). Seguem breves descrições de vários problemas e técnicas adicionais.

    Como as frações decimais muitas vezes não podem ser representadas exatamente em ponto flutuante binário, essa aritmética é melhor quando simplesmente é usada para medir quantidades do mundo real em uma ampla gama de escalas (como o período orbital de uma lua em torno de Saturno ou a massa de um próton) e, na pior das hipóteses, quando se espera que modele as interações de quantidades expressas como cadeias decimais que devem ser exatas. [49] [51] Um exemplo do último caso são os cálculos financeiros. Por esse motivo, o software financeiro tende a não usar uma representação de número de ponto flutuante binário. [53] O tipo de dados "decimal" das linguagens de programação C # e Python, e os formatos decimais do padrão IEEE 754-2008, são projetados para evitar os problemas de representações binárias de ponto flutuante quando aplicado a valores decimais exatos inseridos por humanos , e fazer com que a aritmética sempre se comporte conforme o esperado quando os números são impressos em decimais.

    O uso do teste de igualdade (if (x == y).) Requer cuidado ao lidar com números de ponto flutuante. Mesmo expressões simples como 0,6 / 0,2-3 == 0 irão, na maioria dos computadores, falhar em ser verdadeiras [54] (no IEEE 754 precisão dupla, por exemplo, 0,6 / 0,2-3 é aproximadamente igual a -4,44089209850063e-16) . Consequentemente, tais testes são às vezes substituídos por comparações "difusas" (if (abs (x-y) & lt epsilon)., Onde épsilon é suficientemente pequeno e adequado para a aplicação, como 1.0E-13). A sabedoria de fazer isso varia muito e pode exigir uma análise numérica para limitar o épsilon. [47] Os valores derivados da representação dos dados primários e suas comparações devem ser realizados em uma precisão mais ampla e estendida para minimizar o risco de tais inconsistências devido a erros de arredondamento. [51] Muitas vezes é melhor organizar o código de forma que tais testes sejam desnecessários. Por exemplo, em geometria computacional, testes exatos de se um ponto está fora ou em uma linha ou plano definido por outros pontos podem ser realizados usando precisão adaptativa ou métodos aritméticos exatos. [55]

    Pequenos erros na aritmética de ponto flutuante podem aumentar quando algoritmos matemáticos realizam operações um número enorme de vezes. Alguns exemplos são inversão de matriz, computação de vetor próprio e solução de equação diferencial. Esses algoritmos devem ser projetados com muito cuidado, usando abordagens numéricas, como refinamento iterativo, para que funcionem bem. [56]

    A soma de um vetor de valores de ponto flutuante é um algoritmo básico em computação científica e, portanto, é essencial saber quando pode ocorrer perda de significância. Por exemplo, se alguém está adicionando um grande número de números, os adendos individuais são muito pequenos em comparação com a soma. Isso pode levar à perda de significado. Uma adição típica seria algo como

    Os 3 dígitos baixos dos adendos são efetivamente perdidos. Suponha, por exemplo, que seja necessário somar muitos números, todos aproximadamente iguais a 3. Depois de somar 1000 deles, a soma corrente é de cerca de 3000, os dígitos perdidos não são recuperados. O algoritmo de soma de Kahan pode ser usado para reduzir os erros. [47]

    O erro de arredondamento pode afetar a convergência e a precisão dos procedimentos numéricos iterativos. Como exemplo, Arquimedes aproximou π calculando os perímetros de polígonos que inscrevem e circunscrevem um círculo, começando com hexágonos e duplicando sucessivamente o número de lados. Conforme observado acima, os cálculos podem ser reorganizados de uma forma que seja matematicamente equivalente, mas menos sujeita a erros (análise numérica). Duas formas da fórmula de recorrência para o polígono circunscrito são [ citação necessária ] :

    Aqui está um cálculo usando aritmética IEEE "dupla" (um significando com 53 bits de precisão):

    Embora as duas formas da fórmula de recorrência sejam claramente matematicamente equivalentes, [nota 14] a primeira subtrai 1 de um número extremamente próximo de 1, levando a uma perda cada vez mais problemática de dígitos significativos. À medida que a recorrência é aplicada repetidamente, a precisão melhora no início, mas depois se deteriora. Nunca fica melhor do que cerca de 8 dígitos, embora a aritmética de 53 bits deva ser capaz de cerca de 16 dígitos de precisão. Quando a segunda forma de recorrência é usada, o valor converge para 15 dígitos de precisão.