Pergunta

Eu sei que essa é uma pergunta duplicada. Mas eu quero saber com um exemplo. Então, alguém pode explicar isso com um exemplo?

Link para postagem duplicada: Quando devo usar a palavra -chave "Strictfp" em Java?

Foi útil?

Solução

Bem, a resposta de Girinie resume -a bem, mas se você está procurando um exemplo ..

Digamos que você tenha feito um jogo que permita submissões no Highscore, mas somente depois que o servidor valida a pontuação. Um método para validar a pontuação é fazer com que o cliente envie os teclas (e seus registros de data e hora) para o servidor. Idealmente, o servidor jogaria exatamente o mesmo jogo e obteria a mesma pontuação.

Agora, digamos que seu jogo tenha alguma física que possa alterar o resultado do jogo (por exemplo, uma explosão jogando detritos aleatórios que poderiam machucá -lo, se atingir).

A física desse jogo potencialmente pode ser diferente no servidor (mesmo que seja apenas um pouco) do que o cliente (por exemplo, se converter para números inteiros para detecção de colisão, foi arredondado baixa ao invés de acima). Em um caso de borda como esse, você pode ter uma situação em que o jogo do cliente era não atingido por detritos da explosão, mas o jogo do servidor foi - E agora você tem uma diferença de pontuação, o que pode invalidar incorretamente um envio de alta escore

Enquanto strictfp Certamente não é uma bala de prata, é um longo caminho para impor alguma consistência de 'reproduzir' instruções em diferentes plataformas.

Outras dicas

Isso é o que o Java Language Spec diz:

Dentro de uma expressão de Strict FP, todos os valores intermediários devem ser elementos do conjunto de valor float ou do conjunto de valor duplo, o que implica que os resultados de todas as expressões de estrito FP devem ser aqueles previstos pela aritmética IEEE 754 em operando representados usando formatos únicos e duplos . Dentro de uma expressão que não é estrito do FP, alguma margem de manobra é concedida para que uma implementação use um intervalo de expoente estendido para representar resultados intermediários; O efeito líquido, aproximadamente falando, é que um cálculo pode produzir "a resposta correta" em situações em que o uso exclusivo do conjunto de valores de float ou conjunto de valor duplo pode resultar em excesso ou subflow.

O que isso significa é o seguinte: aritmética de ponto flutuante (ou seja, cálculos envolvendo o float e double tipos) em java é especificado para aderir ao IEEE 754 padrão, que diz exatamente como representar números FP. O problema é que as CPUs modernas usam internamente a aritmética FP que não adere a esse padrão para resultados intermediários - isso geralmente não é um problema, porque na verdade é mais rápido e produz resultados mais exatos. Mas isso pode significar que um programa produz resultados ligeiramente diferentes, dependendo de qual hardware ele é executado - o que é contra a promessa básica da independência da plataforma de Java.

o strictfp A palavra -chave permite garantir que essa promessa seja cumprida e que o programa terá exatamente o mesmo resultado, independentemente de onde ela é executado - mas isso tem o custo de menor desempenho em hardware, onde um esforço extra deve ser gasto para fazer com que os cálculos de FP adetem a IEEE 754 em todos os resultados intermediários.

Na maioria das vezes, você tem melhor desempenho, em vez de resultados idênticos garantidos entre plataformas, e é por isso que strictfp O comportamento é opcional. Na verdade, foi feito Opcional no Java 1.4 depois que os implementadores da JVM perceberam que precisavam fazer com que a CPU trabalhe extra para atender às especificações quando na maioria das vezes essa adesão estrita não tinha vantagens.

Strictfp é muito especial.

Vamos ver com um Um exemplo de agência espacial.

O código escrito usa números científicos muito específicos, agora esses números estão em Decimais multi-placados.

Esses Decimais Value efeitos a trajetória do caminho do navio espacial, que é efetuado por minhas constantes como atrito, gravidade, calor, umidade, raio solar recebido, eletricidade gerada, corpo gravitacional múltiplo, velocidade, combate eficiente.

O ponto principal é que, quando os dados são enviados para avaliação para acompanhar o navio, ele deve retornar o valor que é o mesmo para uma plataforma diferente caso contrário, receberemos dados que são um pouco diferentes em valor decimal.

Mas isso não é considerado uma diferença tão pequena, pois resultará no navio para desviar de sua trajetória, lembre O cálculo deve ser muito específico e consistente para a plataforma diferente, ele deve ter standers e precisão de precis.

Para este requisito, temos Strictfp em Java.

Você quer um programa para demonstrar, É difícil mostrar isso com precisão com um pequeno programa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top