Torre numérica

No Scheme e nos dialetos Lisp inspirados nele, a torre numérica é um conjunto de tipos de dados que representam números e uma lógica para sua organização hierárquica.

Uma representação da torre numérica com cinco tipos de números.

Cada tipo na torre "assenta" conceitualmente em um tipo mais fundamental, portanto, um número inteiro é um número racional e um número , mas o inverso não é necessariamente verdadeiro, ou seja, nem todo número é um número inteiro. Esta assimetria implica que uma linguagem pode permitir com segurança coerções implícitas de tipos numéricos - sem criar problemas semânticos - em apenas uma direção: coagir um inteiro a um racional não perde nenhuma informação e nunca influenciará o valor retornado por uma função, mas coagir a maioria dos reais para um número inteiro alteraria qualquer cálculo relevante (por exemplo, o 1/3 real não é igual a nenhum número inteiro) e é, portanto, inadmissível.

Em Lisp

Principalmente, a torre numérica é projetada para codificar as propriedades teóricas dos números em uma linguagem fácil de implementar: todo número inteiro é um racional com um denominador implícito de 1, e todos os reais são complexos com uma parte imaginária implícita de 0. Na prática, a implementação pode economizar tempo e espaço ignorando essas propriedades, a menos que elas se tornem aritmeticamente relevantes, e também pode melhorar correspondentemente a eficiência de sua representação ao reduzir valores numéricos à sua representação canônica , eliminando componentes desprezíveis de um número.

O tipo mais genérico, number, tem um nome um tanto confuso: ele existe para capturar todos os valores matemáticos cujo tipo é mais geral que complexo , mas que ainda são utilizáveis ​​com operações matemáticas padrão, conforme definido pelo Scheme. Assim, ele captura, por exemplo, infinito positivo e negativo ( +inf.0e -inf.0, o significando aqui significa aproximação até a cardinalidade), uma vez que esses são objetos matemáticos aos quais pelo menos algumas operações numéricas podem ser aplicadas validamente (por exemplo, pode-se adicionar ou multiplicar pelo infinito, produzindo o infinito; ou compare a cardinalidade com o infinito, sendo o infinito sempre maior que qualquer valor finito). [1] Em um nível mais técnico, numberno Lisp simplesmente fornece um lugar na hierarquia de tipos para os tipos de valores não estritamente numéricos definidos pelo IEEE 754 .

A linguagem de programação Scheme define toda a sua aritmética dentro deste modelo, assim como a maioria dos outros dialetos Lisp. [2] [3] Algumas implementações podem estender ou adaptar a torre. Kawa , uma implementação do Scheme para a JVM , estende a torre para incluir quaternions [4] e quantidades, [5] com quantidades sendo uma forma de subtipificar valores numéricos com unidades; por exemplo, um número de gramas não pode ser adicionado de forma significativa a um número de metros porque, através das quantidades, os números herdam a lógica derivada da análise dimensional para governar o seu significado em relação e, portanto, interações aritméticas válidas entre si.

Outra variação comum é suportar versões exatas e inexatas da torre ou de partes dela; O esquema R 7 RS recomenda, mas não exige estritamente isso nas implementações. Neste caso, semântica semelhante é usada para determinar a permissibilidade da coerção implícita: a inexatidão é uma propriedade contagiosa dos números, [6] e qualquer operação numérica envolvendo valores exatos e inexatos deve produzir valores de retorno inexatos de pelo menos a mesma precisão que o número inexato mais preciso que aparece na expressão, a menos que a precisão seja praticamente infinita (por exemplo, contendo uma repetição detectável ), ou a menos que possa ser provado que a precisão do resultado da operação é independente da inexatidão de qualquer um de seus operandos (por exemplo, uma série de multiplicações onde pelo menos um multiplicando é 0).

Em outras línguas

A maioria das linguagens de programação e implementações de linguagem não suportam uma torre numérica do tipo Scheme, embora algumas linguagens forneçam suporte limitado ou inconsistente se a simplicidade da implementação permitir. Python , por exemplo, fornece uma estrutura semelhante via PEP3141, [7] citando o exemplo de Scheme, embora na prática os números racionais ( fractions) devam ser importados de seu próprio módulo, e tanto os números racionais quanto os complexos usam uma sintaxe ligeiramente variante dos literais de números normais, já que A sintaxe do Python é menos explícita que a do Lisp.

Assim, nos seguintes exemplos de esquema, vemos:

1 -2 +3 1 -2 3 1/3 1/3 72/6+8/3i 12+8/3i ; coerção: forma canônica ( + 3+2i 2-2i ) 5 ; coerção: forma canônica ( - 3-62/32i 1+inf.0i ) 2-inf.0i ; coerção: cardinalidade infinita ( > 3+0/2i 3 ) #f ; coerção: 3 ≯ 3  
 
 
 

 

               
  
                     
  
              
  
                    

Enquanto nos seguintes exemplos de Python vemos:

1 ;  - 2 ;  + 3 
 1 
 - 2 
 3 
1/3 0,3333333333333333 inf = float ( 'inf' ) 
# infinito não é de primeira classe a partir de frações importar Fração x = Fração ( 1 , 3 ) y = Fração ( 2 , 3 ) x + y Fração ( 1 , 1 ) # sem coerção ( 3 + 2 j ) ( 3 + 2 j ) complexo ( x , inf ) ( 0,3333333333333333 + infj ) # coerção: igualdade violada a = 1/3 b = Fração ( 1 , 3 ) caz = complexo ( a , 0 ) cbz = complexo ( b , 0 ) a == b Falso caz == cbz Verdadeiro # prova de violação de igualdade complexa ( x + y , -inf ) ( 1 - infj ) # coerção: igualdade preservada ( 3 + 0 j ) > 3 Traceback ( última chamada mais recente ): Arquivo "<stdin>" , linha 1 , em < módulo > # sem coerção: erro de tipo TypeError : '> ' não suportado entre instâncias de 'complexo' e 'int' 
                         
   
   
   
  
                           

 
 
               
  
   
   
   
  
 
  
                                    
   
                                
  
     
          
          

Nos exemplos do Python, podemos ver que problemas numéricos surgem livremente com uma aplicação inconsistente da semântica do seu tipo coerção. Enquanto 1 / 3em Python é tratado como uma chamada para dividir 1 por 3, produzindo um float, a inclusão de racionais dentro de um número complexo, embora claramente permitida, implicitamente os coage de racionais para floats ou ints, mesmo nos casos em que isso é incorreto.

Smalltalk é outra linguagem de programação que segue esse modelo, mas possui ArithmeticValue e Magnitude como superclasses de Number.

Referências

  1. ^ "Relatório revisado7 sobre o esquema de linguagem algorítmica: 6.2.4: Extensões de implementação" (PDF) .
  2. ^ "Relatório revisado5 sobre o esquema de linguagem algorítmica: 6.2.1: Tipos numéricos" (PDF) .
  3. ^ "Relatório revisado7 sobre o esquema de linguagem algorítmica: 6.2.1: Tipos numéricos" (PDF) .
  4. ^ "Documentação de referência Kawa‌: 12.4. Quaternions" .
  5. ^ "Documentação de referência Kawa‌: 12,5 quantidades e unidades" .
  6. ^ "Relatório revisado7 sobre o esquema de linguagem algorítmica: 6.2.2: Exatidão" (PDF) .
  7. ^ "PEP 3141 - Uma hierarquia de tipos para números" .
Obtido em "https://en.wikipedia.org/w/index.php?title=Numerical_tower&oldid=1153290304"