2010-01-06 2 views
-1

Je sais que c'est une question en double. mais je veux le savoir avec un exemple. donc quelqu'un peut-il l'expliquer avec un exemple?à quoi sert le modificateur de non-accès strictfp?

Lien vers en double message: When should I use the "strictfp" keyword in java?

+0

s'il vous plaît modifier le poste avec un lien vers le duplicata. – akf

+0

Exemple de quoi? De code? Imaginez juste une classe/méthode avec ce modificateur. C'est absolument tout. Vous devez encore comprendre ce qui se passe exactement "sous le capot". Cela ne peut pas être fait avec un "exemple de code simple". – BalusC

+0

@GuruKulki, voir http://guruzon.com/1/java-basics/access-modifiers/use-of-strictfp-keyword-method-class-examples-tutorial – Pacerier

Répondre

4

Eh bien, la réponse de girinie cela résume bien, mais si vous cherchez un exemple ..

Disons que vous avez fait un jeu qui permet des soumissions de highscore, mais seulement après que le serveur valide le score. Une méthode pour valider le score est que le client envoie les touches (et leurs horodatages) au serveur. Idéalement, le serveur jouerait exactement le même jeu et obtiendrait le même score. Maintenant, disons que votre jeu a une physique qui peut altérer le résultat du jeu (par exemple une explosion projetant des débris aléatoires qui POURRAIENT vous blesser, si elle frappe).

La physique de ce jeu pourraient être différents sur le serveur (même si elle est légèrement) que le client (par exemple, si la conversion en nombres entiers pour la détection de collision, il a été arrondi vers le bas au lieu de jusqu'à). Sur un bord comme ça, vous pourriez avoir une situation où le jeu client était pas frappé par des débris de l'explosion, mais le jeu de serveur était - et maintenant vous avez une différence de score, ce qui pourrait incorrectement invalider un meilleur score soumission

Alors que strictfp est certainement pas une balle d'argent, il va un long chemin en imposant une certaine cohérence des instructions de «rejouer» à travers différentes plates-formes.

+0

désolé matt je n'ai pas eu ce que vous voulez dire. pouvez-vous expliquer avec un exemple simple. – GuruKulki

+0

J'ai ajouté quelques détails juste avant le dernier paragraphe, laissez-moi savoir si ce n'est pas encore clair. – Matt

+0

vous remercie .. maintenant je l'ai – GuruKulki

0

Lorsque vous utilisez le modificateur de strictfp sur une méthode ou une classe, le compilateur génère du code qui se conforme strictement à la spécification Java pour des résultats identiques sur toutes les plateformes. Sans strictfp, c'est un peu laxiste, mais pas trop laxiste pour utiliser les bits de garde du Pentium pour donner 80 bits de précision. Avec JET, il y a une option pour utiliser les 80 bits complets dans le calcul.

1

C'est ce que l'java language spec dit:

Au sein d'une expression FP-stricte, toutes les valeurs intermédiaires doivent être des éléments de la valeur flottante fixé ou le jeu à double valeur, ce qui implique que les résultats de toutes les expressions strictes FP doivent être celles prédites par l'arithmétique IEEE 754 sur les opérandes représentés en utilisant le format unique et les formats doubles. Dans une expression qui n'est pas FP-strict, une certaine marge de est accordée pour une implémentation pour utiliser une plage étendue d'exposants pour représenter résultats intermédiaires; l'effet net, grosso modo, est qu'un calcul pourrait produire « la réponse correcte » dans des situations où l'usage exclusif du jeu de valeur flottante ou un jeu à double valeur peut entraîner un débordement ou underflow.

Cela signifie ceci: l'arithmétique en virgule flottante (à savoir les calculs impliquant les float et double types) en Java est spécifié Adher à la norme IEEE 754, qui dit exactement comment représenter les nombres de PF.Le problème est que les processeurs modernes utilisent en interne l'arithmétique FP qui ne respecte pas cette norme pour les résultats intermédiaires - ce n'est généralement pas un problème car il est en fait à la fois plus rapide et donne des résultats plus précis. Mais cela pourrait signifier qu'un programme produit des résultats légèrement différents en fonction du matériel sur lequel il s'exécute - ce qui va à l'encontre de la promesse fondamentale de l'indépendance de la plate-forme de Java. Le mot clé strictfp vous permet de garantir que cette promesse est conservée et que le programme aura exactement le même résultat, quel que soit l'endroit où il s'exécute - mais cela se fait au détriment des performances sur le matériel où un effort supplémentaire doit être consacré faire en sorte que les calculs de FP soient conformes à la norme IEEE 754 pour tous les résultats intermédiaires.

La plupart du temps, vous obtiendrez de meilleures performances plutôt que des résultats identiques garantis sur plusieurs plates-formes, et c'est pourquoi le comportement strictfp est facultatif. En fait, est devenu optionnel en Java 1.4 après que les implémenteurs de JVM aient réalisé qu'ils devaient faire travailler le CPU pour respecter les spécifications quand la plupart du temps cette adhérence stricte n'avait aucun avantage.

1

strictfp c'est très spécial.

Voyons voir avec un Un exemple d'agence spatiale.

Le code écrit utilise des nombres scientifiques très spécifiques. Maintenant, ces nombres sont en décimales multi-positions.

Ces décimales évaluent les effets de la trajectoire de la voie de vaisseau spatial, qui est effectuée par mes constantes telles que la friction, la gravité, la chaleur, l'humidité, soleil à rayons reçus, l'électricité produite, le corps gravitationnel multiple, la vitesse de combustion efficace.

Le point principal est que lorsque les données sont envoyées pour évaluation pour garder la trace du navire, devrait retourner la valeur qui est la même pour la plate-forme différente sinon nous recevrons des données qui sont légèrement différentes en valeur décimale.

Mais ce n'est pas considéré comme une petite différence, car il faudra détourner le navire de sa trajectoire, Rappelez-vous calcul différentiel, chaque petit point fait trajectoire, donc notre calcul doit être très spécifique et cohérente même plate-forme différente , il doit avoir des supports et précision précise.

Pour cette exigence, nous avons strictfp en Java.

Vous voulez un programme pour le démontrer, il est difficile de montrer cela avec précision avec un petit programme.