Classe Math
1 |
public final class <strong>Math</strong> extends <a href="https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Object.html">Object</a> |
A classe Math contém métodos para executar operações numéricas básicas, como as funções exponencial elementar, logaritmo, raiz quadrada e trigonométrica.
Ao contrário de alguns dos métodos numéricos da classe StrictMath, todas as implementações das funções equivalentes da classe Math não são definidas para retornar os mesmos resultados bit a bit.
Esse relaxamento permite implementações com melhor desempenho, onde a reprodutibilidade estrita não é necessária.
Por padrão, muitos dos métodos Math simplesmente chamam o método equivalente no StrictMath para sua implementação.
Os geradores de código são incentivados a usar bibliotecas nativas específicas da plataforma ou instruções de microprocessador.
Quando disponíveis, para fornecer implementações de alto desempenho dos métodos Math. Tais implementações de desempenho superior ainda devem estar em conformidade com a especificação para Math.
A qualidade das especificações de implementação refere-se a duas propriedades: precisão do resultado retornado e monotonicidade do método. A precisão dos métodos matemáticos de ponto flutuante é medida em termos de ulps, unidades em último lugar.
Matemática em Java: Mastigando Números na JVM
Para um determinado formato de ponto flutuante, uma ulp de um valor específico de número real é a distância entre os dois valores de ponto flutuante entre colchetes nesse valor numérico.
Discutir a precisão de um método como um todo, e não em um argumento específico, o número de ulps citadas é o pior erro de qualquer argumento.
Se um método sempre tiver um erro menor que 0,5 ulps, o método sempre retornará o número de ponto flutuante mais próximo do resultado exato; esse método é arredondado corretamente.
Números Arrendondados às Vezes é Melhor do que Números Flutuantes
Um método arredondado corretamente é geralmente o melhor que uma aproximação de ponto flutuante pode ser; no entanto, é impraticável que muitos métodos de ponto flutuante sejam arredondados corretamente.
Em vez disso, para a classe Math, um limite maior de erro de 1 ou 2 ulps é permitido para certos métodos.
Informalmente, com um erro de 1 ulp associado, quando o resultado exato é um número representável, o resultado exato deve ser retornado como o resultado calculado.
Caso contrário, qualquer um dos dois valores de ponto flutuante que suportam o resultado exato pode ser retornado.
Para resultados exatos grandes em magnitude, um dos pontos finais do suporte pode ser infinito. Além da precisão nos argumentos individuais, também é importante manter relações adequadas entre o método em diferentes argumentos.
Portanto, é necessário que a maioria dos métodos com mais de 0,5 erros de ulp seja semi-monotônica: sempre que a função matemática não diminui.
O mesmo ocorre com a aproximação de ponto flutuante; da mesma forma, sempre que a função matemática não aumenta, o mesmo ocorre com a flutuação. aproximação de ponto.
Nem todas as aproximações com precisão de 1 ulp atendem automaticamente aos requisitos de monotonicidade. A plataforma usa aritmética de número inteiro do complemento assinado dois com tipos primitivo int e long.
O desenvolvedor deve escolher o tipo primitivo para garantir que as operações aritméticas produzam consistentemente resultados corretos.
O que em alguns casos significa que as operações não excederão o intervalo de valores da computação. A melhor prática é escolher o tipo e o algoritmo primitivos para evitar o estouro. Nos casos em que o tamanho é int ou longo e os erros de estouro precisam ser detectados.
Os métodos addExact, subtractExact, multiplyExact, toIntExact, incrementExact, decrementExact e negateExact lançam uma ArithmeticException quando os resultados excedem.
Cuidados com os Valores Máximos e Mínimos
A divisão aritmética das operações e o valor absoluto, o estouro ocorre apenas com um valor mínimo ou máximo específico e deve ser verificado em relação ao mínimo ou máximo, conforme apropriado.
Essa classe existe desde a versão 1 do Java.
Fonte: https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Math.html
Deixe um comentário