271 votes

Quand dois-je utiliser le mot clé « strictfp » en java ?

OK, j’ai regardé ce que cela fait, mais quelqu'un a-t-il réellement un exemple quand vous utiliser le mot clé « strictfp » en java ? Est-ce que quelqu'un a effectivement trouvé une utilisation pour cela ?

Y aurait-il des effets secondaires de juste le mettre sur mon flottant pointez opérations ?

285voto

Dan Dyer Points 30082

Strictfp garantit que vous obtenez exactement les mêmes résultats de vos calculs en virgule flottante sur chaque plate-forme. Si vous n'utilisez pas strictfp, la JVM est libre d'utiliser une précision supplémentaire le cas échéant.

À partir de la JLS:

Au sein d'une FP-strict de l'expression, tous les les valeurs intermédiaires doivent être des éléments de la valeur float ou double valeur définie, ce qui implique que les résultats de tous FP-strict expressions doivent être ceux prédits par la norme IEEE 754 arithmétique sur les opérandes représenté en utilisant un seul et le double de formats. Au sein d'une expression qui n'est pas FP-strict, certains marge de manœuvre est accordée pour une la mise en œuvre d'utilisation prolongée plage d'exposants pour représenter les résultats intermédiaires; l'effet net, grosso modo, c'est qu'un le calcul est susceptible de produire "le bon réponse" dans les situations où exclusif l'utilisation du float valeur définie ou double définir la valeur peut entraîner de dépassement de capacité ou dépassement de capacité.

En d'autres termes, c'est faire en sorte que les Write-Once-Run-n'importe où , signifie en fait Write-Once-Get-Aussi-Mal-Résultats-Partout.

Avec strictfp vos résultats sont portables, sans elle, ils sont plus susceptibles d'être précis.

68voto

MattK Points 7319

Wikipedia a fait un bon article sur ce sujet ici, avec un lien vers la spécification de Java.

En lisant entre les lignes, l'implication est que si vous ne spécifiez strictfp, puis la JVM et le compilateur JIT ont permis de calculer vos calculs en virgule flottante cependant qu'ils veulent. Dans l'intérêt de la vitesse, ils seront plus susceptibles de déléguer le calcul de votre processeur. Avec strictfp sur, les calculs doivent être conformes à la norme IEEE 754 arithmétique des normes qui, dans la pratique, signifie probablement que la JVM va faire le calcul.

Alors, pourquoi voudriez-vous d'utiliser strictfp? Un scénario que je peux voir, c'est dans une application distribuée (ou jeu multijoueur), où tous les calculs en virgule flottante doivent être déterministe, quel que soit le matériel sous-jacent ou de l'UC est. Quel est le trade-off? Les plus susceptibles de temps d'exécution.

21voto

Michael Myers Points 82361

Voici quelques références:

  • À l'aide de strictfp (JDC Conseil technique)
  • jGuru: qu'est-Ce que le strictfp modificateur? Quand devrais-je envisager de l'utiliser?

    Fondamentalement, ce que tout se résume à savoir si ou non vous vous souciez que les résultats de virgule flottante expressions dans votre code sont rapides ou prévisible. Par exemple, si vous avez besoin de réponses que votre code est livré avec de qui utilise les valeurs à virgule flottante à travers de multiples plates-formes puis utilisez strictfp.

  • strictfp - Java Glossaire

    Matériel de point flottant calcule avec plus de précision, et avec une plus grande gamme de valeurs que la spécification de Java exige. Il serait source de confusion si certaines plates-formes ont donné plus de précision que les autres. Lorsque vous utilisez l' strictfp modificateur sur une méthode ou une classe, le compilateur génère du code qui respecte strictement la Java spec pour des résultats identiques sur toutes les plateformes. Sans strictfp,, elle est légèrement plus lâches, mais pas aussi laxiste que l'utilisation de la garde de bits dans le Pentium à donner à 80 bits de précision.

  • Et enfin le réel Java Language Specification, §15.4 FP-strict Expressions:

    Au sein d'une FP-strict de l'expression, toutes les valeurs intermédiaires doivent être des éléments de la valeur float ou double valeur définie, ce qui implique que les résultats de toutes les FP-strict expressions doivent être celles prévues par la norme IEEE 754 arithmétiques sur des opérandes représentés à l'aide de simples et doubles formats. L'intérieur d'une expression qui n'est pas FP-strict, une certaine marge de manœuvre est accordée pour une mise en œuvre à utiliser la plage d'exposants pour représenter les résultats intermédiaires; l'effet net, grosso modo, est qu'un calcul peut produire "la bonne réponse" dans les situations où l'utilisation exclusive de la valeur float set ou double valeur définie peut entraîner dépassement supérieur ou inférieur.

Je n'ai jamais eu personnellement une utilisation pour elle, si.

12voto

Sean McCauliff Points 1051

Comme les autres réponses mentionné cause l'intermédiaire de virgule flottante de résultats pour les rendre conformes à la spécification IEEE. En particulier, les processeurs x86 pouvez stocker les résultats intermédiaires avec différents précision à partir de la spécification IEEE. La situation devient encore plus compliqué lorsque l'équipe optimise un calcul particulier; l'ordre de ces instructions peut être différente à chaque fois légèrement différente de l'arrondissement.

Les frais généraux engagés par strictfp susceptibles d'être très processeur et JIT dépendante. Cet article de wikipédia sur SSE2 semble avoir une certaine compréhension du problème. Donc, si l'équipe peut générer des instructions SSE pour effectuer un calcul, il semble que strictfp n'aurez pas de frais généraux.

Dans mon projet actuel, il y a quelques endroits où j'utilise strictfp. Il y a un point où le potentiel de rayons cosmiques doivent être supprimés à partir de valeurs de pixel. Si certains en dehors de chercheur a la même valeur de pixel et de rayons cosmiques en face d'eux, ils devraient obtenir la même valeur que notre logiciel.

8voto

Rahul Saxena Points 161
  • strictfp est un modificateur qui limite les calculs en virgule flottante conformément à la norme IEEE 754.

  • Ceci peut être utilisé sur l'ensemble de la classe comme "public strictfp classe StrictFpModifierExample{}" ou sur la méthode "public strictfp void exemple()".Si elle est utilisée dans la classe que toutes les méthodes à suivre la norme IEEE 754 et si utilisé sur la méthode, la méthode particulière que va suivre la norme IEEE 754.

  • Pourquoi est-il utilisé??::: En tant que plates-formes différentes ont différentes de matériel de point flottant qui permet de calculer avec plus de précision et une plus grande gamme de valeurs que la spécification de java exige ce qui peut produire des diffrent de sortie sur les différentes plateformes.donc, il confirme la même sortie, indépendamment de différentes plateformes

  • strictfp s'assure également de profiter de la vitesse et de la précision de la précision étendue opérations à virgule flottante.

  • Il n'y a pas d'inconvénient à ce mot-clé, nous pouvons utiliser quand nous faisons des calculs en virgule flottante

  • Mon dernier point est --Ce qui est IEEE754 en bref La norme IEEE 754 définit la méthode standard pour les calculs en virgule flottante de stockage et de valeurs à virgule flottante en simple (32 bits, Java flotteurs) ou double (64 bits, Java doubles) de précision.Il définit également des normes pour les intermédiaires des calculs et de la précision étendue de formats.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X