Pergunta

Eu olhei para cima o que este faz, mas alguém realmente tem um exemplo de quando você usaria a palavra-chave strictfp em Java? Tem alguém realmente encontrou um uso para isso?

haveria qualquer efeitos colaterais de apenas colocá-lo em todas as minhas operações de ponto flutuante?

Foi útil?

Solução

strictfp garante que você obtenha exatamente os mesmos resultados de seus cálculos de ponto flutuante em todas as plataformas. Se você não usar strictfp, a implementação JVM é livre para usar precisão extra, onde disponível.

Dos JLS :

Dentro de uma expressão FP-estrita, todas valores intermédios devem ser elementos do conjunto de valor float ou duplo valor definido, o que implica que os resultados de todas as expressões FP-estrita deve ser aqueles previstos pela aritmética IEEE 754 em operandos representados usando única e formatos de casal. dentro de uma expressão que não é FP-estrito, alguns margem de manobra é concedida por um implementação usar um prolongado expoente gama para representar resultados intermédios; o efeito líquido, grosso modo, é que uma cálculo pode produzir "a correta resposta" em situações em exclusivo usar do conjunto valor float ou duplo valor definido pode resultar em estouro ou underflow.

Em outras palavras, trata-se de certificar-se de que Write-Once-Run-em qualquer lugar realmente significa Write Once--Get-equitativamente erradas de resultados de todos os lugares .

Com strictfp seus resultados são portáteis, sem que eles são mais propensos a ser preciso.

Outras dicas

Wikipedia realmente tem um bom artigo sobre este tema aqui , com um link para a especificação Java .

Leitura entre as linhas, a implicação é que, se você não especificar strictfp, então a JVM e compilador JIT tem licença para calcular seus cálculos de ponto flutuante no entanto eles querem. No interesse de velocidade, eles provavelmente irão delegar o cálculo para o seu processador. Com strictfp em diante, os cálculos têm de estar de acordo com IEEE 754 padrões aritméticos, que, na prática, provavelmente significa que o JVM vai fazer o cálculo.

Então, por que você iria querer usar strictfp? Um cenário que posso ver é em uma aplicação distribuída (ou jogo multiplayer), onde todos os cálculos de ponto flutuante precisa ser determinista não importa o que o hardware ou CPU subjacente é. Qual é o trade-off? Mais tempo de execução provável.

Tudo começou com uma história,

Quando java estava sendo desenvolvido por James Gosling, Herbert e descansar da sua equipa. Eles tinham essa coisa louca em mente chamado independência de plataforma . Eles queriam fazer carvalho (Java) muito melhor que ele seria executado exatamente igual em qualquer máquina com conjunto de instruções diferentes, mesmo executando diferentes sistemas operacionais. Mas, houve um problema com números de pontos decimais também conhecido como ponto e dupla flutuando em linguagens de programação. Algumas máquinas foram construídas visando a eficiência enquanto outros foram alvo precisão. Assim, as máquinas mais tarde (mais preciso) tinha o tamanho de ponto flutuante como 80 bits enquanto as máquinas do antigo (mais rápido / mais eficiente) teve 64 duplas bits. Mas, este foi contra lá ideia central da construção de uma linguagem independente de plataforma. Além disso, isso pode levar à perda de precisão / dados quando um código é construído em alguma máquina (com o dobro do tamanho de 64 bit) e executado em outro tipo de máquina (com o dobro do tamanho de 80 bits).

Up-dimensionamento pode ser tolerada, mas redução do tamanho não pode ser. Então, se depararam com um conceito de strictfp ou seja, estrito ponto flutuante . Se você usar esta palavra-chave com uma classe / função, em seguida, seu ponto flutuante e duplos têm um tamanho consistente ao longo de toda a máquina. isto é, 32/64 bits, respectivamente.

Aqui estão algumas referências:

  • Usando strictfp (JDC tecnologia Tip)
  • jGuru: Qual é o modificador strictfp para? Quando devo considerar a usá-lo?

    Basicamente, o que isso tudo ferve para baixo é se deve ou não se importa que os resultados de expressões de ponto flutuante em seu código são rápidos ou previsível. Por exemplo, se você precisar as respostas que seu código surge com que utiliza valores de ponto flutuante para ser consistente em múltiplas plataformas, em seguida, usar strictfp.

  • strictfp - Java Glossário

    Floating calcula hardware ponto com mais precisão, e com uma gama maior de valores do que a especificação Java requer. Seria confuso se algumas plataformas deu mais precisão do que outros. Quando você usa o modificador strictfp em um método ou classe, o compilador gera código que segue rigorosamente a especificação Java para resultados idênticos em todas as plataformas. Sem strictfp, é que é um pouco laxer, mas não tão frouxa como usar os bits de guarda no Pentium para dar 80 bits de precisão.

  • E, finalmente, o real Java Language Specification, §15.4 FP-rígidas :

    Dentro de uma expressão FP-estrito, todos os valores intermédios devem ser os elementos do conjunto valor flutuador ou o conjunto de valor duplo, o que implica que os resultados de todas as expressões FP-rígida deve ser aqueles previstos pelo IEEE 754 aritmética em operandos representados usando única e formatos de casal. Dentro de uma expressão que não é FP-estrita, uma certa margem é concedida a uma aplicação para usar uma gama expoente estendida para representar os resultados intermédios; o efeito líquido, grosso modo, é que um cálculo pode produzir "a resposta correta" em situações em que o uso exclusivo do conjunto de valor float ou conjunto duplo valor pode resultar em estouro ou estouro negativo.

Eu nunca pessoalmente tinha um uso para ele, no entanto.

Como as outras respostas mencionado causar os intermediários resultados de ponto flutuante para estar em conformidade com a especificação IEEE. Em particular processadores x86 pode armazenar resultados intermediários com precisão diferente da especificação IEEE. A situação fica mais complicada quando o JIT otimiza um cálculo particular; a ordem das instruções pode ser diferente de cada vez, resultando em arredondamento ligeiramente diferente.

A sobrecarga contraída por strictfp provável que seja muito processador e JIT dependente. Este artigo da Wikipedia sobre SSE2 parece ter algum conhecimento sobre o problema. Portanto, se o JIT pode gerar instruções SSE para executar um cálculo parece que strictfp não terá qualquer sobrecarga.

No meu projeto atual, existem alguns lugares onde eu uso strictfp. Há um ponto em que os potenciais raios cósmicos precisam ser removidos de valores de pixel. Se algum pesquisador exterior tem ao mesmo valor de pixel e de raios cósmicos na frente deles eles devem receber o mesmo valor resultante como o nosso software.

  • strictfp é um modificador que restringe cálculos de ponto flutuante de acordo com IEEE 754.

  • Isso pode ser usado em toda a classe como "StrictFpModifierExample strictfp pública classe {}" ou no método "strictfp público exemplo void ()". Se ele é usado em classe do que todos os métodos seguirá IEEE 754 e se usado no método, em seguida, método particular seguirá IEEE 754.

  • Por que ele é usado ?? ::: Como diferentes plataformas têm um hardware diferente de ponto flutuante que calcula com mais precisão e maior intervalo de valores do que a especificação Java requer que pode produzir uma saída diferente e foi decorado em diffrent plateforms.so confirma a mesma saída, independentemente do diffrent plateforms

  • strictfp assegura também para aproveitar a velocidade e precisão da precisão estendida operações de vírgula flutuante.

  • Não há nenhuma desvantagem com esta palavra-chave que pode usar quando estamos fazendo cálculos de ponto flutuante

  • O meu último ponto é --O que é IEEE754 em suma IEEE método padrão 754 define para ambos os cálculos de ponto flutuante e armazenamento de valores de ponto flutuante em qualquer única (de 32 bits, utilizado em Java flutua) ou dupla (64 bits, usado em duplas Java) precision.It também define as normas para cálculos intermédios e para formatos de precisão estendida.

strictfp é uma palavra-chave e pode ser usado como um modificador não não-acesso para classes ou um métodos (mas nunca variáveis). Marcando uma classe como meio strictfp que qualquer código método na classe estará em conformidade com os IEEE 754 regras padrão para pontos flutuantes.

Sem esse modificador, pontos flutuantes utilizados nos métodos podem se comportar de uma maneira dependente de plataforma. Com ele você pode prever como os seus pontos flutuantes irá se comportar independentemente da plataforma subjacente a JVM está sendo executado. A desvantagem é que se a plataforma subjacente é capaz de suportar uma maior precisão, um método strictfp não será capaz de tirar proveito dela.

Se você não declarar uma classe como strictfp, você ainda pode obter o comportamento strictfp em uma base método-by-método, ao declarar um método como strictfp.

~ SCJP Sun®Certified Programmer for Java ™ 6 - Kathy Sierra e Bert Bates ~

Maio exemplo abaixo ajuda a entender isso mais claro: Em java sempre que estiver usando procurando informações precisas para qualquer operação, por exemplo, se fizermos dupla num1 = 10e + 102; duplo num2 = 8e + 10; resultar = num1 + num2;

        The output will be so long and not precise, becasue it is precissed by the hardware e.g JVM and JIT has the license 
        as long as we dont have specify it Strictfp

Marking it Strictfp will make the result Uniform on every hardware and platform, because its precised value will be same
One scenario I can see is in a distributed application (or multiplayer game) where all floating-point calculations need to 
be deterministic no matter what the underlying hardware or CPU is.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top