tenho encontrado pouca coisa ou nada sobre o strictpf gostaria de saber para que serve e como se usa
strictfp indica que os cálculos de ponto flutuante devem seguir as normas de precisão do IEEE. Acontece que máquinas diferentes podem ter tamanhos diferentes de registradores para trabalhar com float, e isso pode levar a resultados diferentes, caso a norma não seja obedecida à risca. Geralmente, isso não é um problema, mas aplicações que dependam de resultados estáveis em multi-plataforma podem se ressentir desse fato, e portanto, ter que recorrer ao strictfp.
Sim isso eu ja li. obrigado, mas podias dar um exemplo simples
Estude registradores que voce vai entender o que ele disse.
ok, vou procurar registradores
Elaborar um exemplo é difícil. Por que isso envolve o hardware e, se não me engano, as VMs da Sun são sempre strictfp.
Entretanto, é bom você entender por que existem imprecisões em frações: http://www.guj.com.br/posts/list/84121.java#448928
E que um hardware com um registrador maior terá mais imprecisão. Veja no tópico acima, notou que quanto mais bits eu levava em conta, mais próximo do número que queríamos obter o resultado ficava?
Agora, imagine que 2 máquinas de registradores diferentes representem 3/10 como:
0,296875 na primeira e 0,28125 (claro que na prática sempre será mais preciso que isso).
Ou seja, a mesma instrução:
float x = 3/10;
Na primeira máquina poderá retornar 0,28125 e na segunda 0,296875. Isso vc entendeu?
Aí, mas para frente, o programa faz algo como:
x = x * 100000;
Qual foi o tamanho da imprecisão?
Muitas vezes, numa aplicação matemática, é melhor que os resultados sejam consistentes, entre as duas máquinas, mesmo que menos precisos. No caso, usando strictfp, o java forçaria que ambas seguissem o padrão do IEEE. Assim, mesmo que os registradores sejam diferentes, ambas dariam exatamente o mesmo resultado.
Eu me lembro que havia um tempo em que a JVM da BEA (JRockit) tinha distinção entre operações strictfp e não strictfp em máquinas Intel x86.
Ou seja, ela usava a precisão intermediária do coprocessador (80 bits) se ela achasse necessário.
Não sei se ela continua assim, é questão de testar (faça a instalação.
De qualquer maneira, como as CPUs modernas x86/x64 têm SSE3/SSE4 e nesses modos a precisão intermediária é 64 bits mesmo, então se a JVM estiver usando SSE3/SSE4 para efetuar operações aritméticas de ponto flutuante, vai acabar trabalhando como se tudo fosse strictfp.
Portanto pode ser que você faça um teste com a JRockit em uma máquina moderna e ela dê o mesmo resultado com ou sem strictfp.
(Só para encher o saco - PF = Prato Feito, FP = Floating Point).