Quand devrais-je utiliser le mot clé “ssortingctfp” dans java?

J’ai regardé ce que cela fait, mais est-ce que quelqu’un a un exemple de l’utilisation du mot clé ssortingctfp en Java? Quelqu’un at-il réellement trouvé une utilisation pour cela?

Est-ce qu’il y aurait des effets secondaires en le mettant sur toutes mes opérations en virgule flottante?

Ssortingctfp garantit que vous obtenez exactement les mêmes résultats avec vos calculs en virgule flottante sur chaque plate-forme. Si vous n’utilisez pas ssortingctfp, l’implémentation JVM est libre d’utiliser des précisions supplémentaires, le cas échéant.

De la JLS :

Dans une expression FP-ssortingct, toutes les valeurs intermédiaires doivent être des éléments de l’ensemble de valeurs float ou des valeurs doubles, ce qui implique que les résultats de toutes les expressions ssortingctes FP doivent être ceux prédits par l’arithmétique IEEE 754 sur les opérandes représentés. . Dans une expression qui n’est pas FP-ssortingct, une marge de manœuvre est accordée à une implémentation pour utiliser une plage d’exposant étendue afin de représenter des résultats intermédiaires. L’effet net, en gros, est qu’un calcul peut produire “la réponse correcte” dans des situations où l’utilisation exclusive de l’ensemble de valeurs flottantes ou de l’ensemble de valeurs doubles pourrait entraîner un dépassement ou un dépassement de capacité.

En d’autres termes, il s’agit de s’assurer que Write-Once-Run-Anywhere signifie réellement Write-Once-Get-Equal-Wrong-Results-Everywhere .

Avec ssortingctfp, vos résultats sont portables, sans quoi ils sont plus susceptibles d’être exacts.

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

En lisant entre les lignes, l’implication est que si vous ne spécifiez pas ssortingctfp , le compilateur JVM et JIT possède une licence pour calculer vos calculs en virgule flottante comme ils le souhaitent. Par souci de rapidité, ils vont probablement déléguer le calcul à votre processeur. Avec ssortingctfp on, les calculs doivent être conformes aux normes arithmétiques IEEE 754, ce qui, dans la pratique, signifie probablement que la JVM effectuera le calcul.

Alors, pourquoi voudriez-vous utiliser ssortingctfp ? Un scénario que je peux voir concerne une application dissortingbuée (ou un jeu multijoueur) où tous les calculs à virgule flottante doivent être déterministes, quel que soit le matériel ou le processeur sous-jacent. Quel est le compromis? Très probablement temps d’exécution.

Voici plusieurs références:

  • Utilisation de ssortingctfp (astuce technique JDC)
  • jGuru: Quel est le modificateur ssortingctfp? Quand envisagerais-je de l’utiliser?

    En gros, tout se résume à savoir si les résultats des expressions à virgule flottante dans votre code sont rapides ou prévisibles. Par exemple, si vous avez besoin des réponses de votre code qui utilisent des valeurs à virgule flottante pour être cohérentes sur plusieurs plates-formes, utilisez ssortingctfp .

  • ssortingctfp – Glossaire Java

    Le matériel à virgule flottante calcule avec plus de précision et avec une plage de valeurs supérieure à celle requirejse par la spécification Java. Ce serait déroutant si certaines plateformes donnaient plus de précision que d’autres. Lorsque vous utilisez le modificateur ssortingctfp sur une méthode ou une classe, le compilateur génère du code qui respecte ssortingctement les spécifications Java pour des résultats identiques sur toutes les plates-formes. Sans ssortingctfp , il est légèrement plus laxiste, mais pas trop laxiste pour utiliser les bits de garde dans le Pentium pour donner 80 bits de précision.

  • Et enfin la spécification Java Language, §15.4 FP-ssortingct Expressions :

    Dans une expression FP-ssortingct, toutes les valeurs intermédiaires doivent être des éléments de l’ensemble de valeurs float ou des valeurs doubles, ce qui implique que les résultats de toutes les expressions ssortingctes FP doivent être ceux prédits par l’arithmétique IEEE 754 sur les opérandes représentés. . Dans une expression qui n’est pas FP-ssortingct, une marge de manœuvre est accordée à une implémentation pour utiliser une plage d’exposant étendue afin de représenter des résultats intermédiaires. L’effet net, en gros, est qu’un calcul peut produire “la réponse correcte” dans des situations où l’utilisation exclusive de l’ensemble de valeurs flottantes ou de l’ensemble de valeurs doubles pourrait entraîner un dépassement ou un dépassement de capacité.

Personnellement, je ne l’ai jamais utilisé.

Tout a commencé avec une histoire,

Lorsque java était développé par James Gosling, Herbert et le rest de son équipe. Ils avaient cette idée folle en tête appelée indépendance de la plate-forme . Ils voulaient rendre Oak (Java) tellement mieux qu’il fonctionnerait exactement de la même façon sur toutes les machines ayant des jeux d’instructions différents, même sur des systèmes d’exploitation différents. Mais, il y avait un problème avec les nombres décimaux également connus sous le nom de virgule flottante et double dans les langages de programmation. Certaines machines ont été conçues pour cibler l’efficacité, tandis que le rest ciblait la précision. Ainsi, les machines plus récentes (plus précises) avaient une taille de virgule flottante de 80 bits alors que les anciennes (plus efficaces / plus rapides) des machines avaient un double de 64 bits. Mais c’était contre l’idée fondamentale de construire un langage indépendant de la plate-forme. En outre, cela pourrait entraîner une perte de précision / des données lorsqu’un code est créé sur une machine (ayant une taille de 64 bits) et fonctionner sur un autre type de machine (ayant une taille de 80 bits).

Up-Sizing peut être toléré mais Down-Sizing ne peut pas l’être. Donc, ils sont tombés sur un concept de ssortingctfp, c’est-à-dire de virgule flottante ssortingcte . Si vous utilisez ce mot-clé avec une classe / fonction, ses virgules flottantes et ses doublons ont une taille cohérente sur toutes les machines. soit 32/64 bits respectivement.

Comme les autres réponses l’ont mentionné, les résultats en virgule flottante intermédiaire sont conformes à la spécification IEEE. En particulier, les processeurs x86 peuvent stocker des résultats intermédiaires avec une précision différente de la spécification IEEE. La situation devient plus compliquée lorsque le JIT optimise un calcul particulier; l’ordre les instructions peuvent être différentes à chaque fois, ce qui entraîne des arrondis légèrement différents.

Les frais généraux encourus par ssortingctfp risquent d’être très dépendants des processeurs et des JIT. Cet article de Wikipedia sur SSE2 semble avoir un aperçu du problème. Donc, si JIT peut générer des instructions SSE pour effectuer un calcul, il semble que ssortingctfp ne soit pas surchargé.

Dans mon projet actuel, il y a quelques endroits où j’utilise ssortingctfp. Il y a un point où les rayons cosmiques potentiels doivent être éliminés des valeurs de pixel. Si un chercheur externe a la même valeur de pixel et le même rayon cosmique devant lui, il devrait obtenir la même valeur que notre logiciel.

  • ssortingctfp est un modificateur qui limite les calculs à virgule flottante selon IEEE 754.

  • Cela peut être utilisé sur toute la classe comme “public ssortingctfp class SsortingctFpModifierExample {}” ou sur la méthode “public ssortingctfp void example ()”. S’il est utilisé sur la classe, toutes les méthodes suivront IEEE 754 suivez IEEE 754.

  • Pourquoi est-il utilisé ?? :: Comme différentes plates-formes ont un matériel à virgule flottante différent qui calcule avec plus de précision et une plus grande plage de valeurs que la spécification Java nécessite une sortie différente sur différentes plates-formes. plates-formes

  • ssortingctfp veille également à tirer parti de la vitesse et de la précision des opérations en virgule flottante de précision étendue.

  • Il n’y a pas d’inconvénient avec ce mot clé que nous pouvons utiliser lorsque nous effectuons des calculs en virgule flottante

  • Mon dernier point est le suivant: – Qu’est-ce que IEEE754 en abrégé IEEE 754 définit une méthode standard pour les calculs à virgule flottante et le stockage des valeurs à virgule flottante en simple (32 bits, en Java float) ou double (64 bits en Java) doubles) precision.Il définit également des normes pour les calculs intermédiaires et pour les formats de précision étendus.

ssortingctfp est un mot-clé et peut être utilisé comme un modificateur non-access pour les classes ou les méthodes (mais jamais les variables). Marquer une classe comme ssortingctfp signifie que tout code de méthode de la classe sera conforme aux règles standard IEEE 754 pour les points flottants.

Sans ce modificateur, les points flottants utilisés dans les méthodes peuvent se comporter de manière dépendante de la plate-forme. Avec lui, vous pouvez prédire le comportement de vos points flottants, quelle que soit la plate-forme sous-jacente sur laquelle la JVM est exécutée. L’inconvénient est que si la plate-forme sous-jacente est capable de supporter une plus grande précision, une méthode ssortingctfp ne pourra pas en tirer parti.

Si vous ne déclarez pas une classe ssortingctfp , vous pouvez toujours obtenir le comportement ssortingctfp méthode par méthode en déclarant une méthode ssortingctfp .

~ Programmeur certifié SCJP Sun® pour Java ™ 6 – Kathy Sierra & Bert Bates ~

Peut-être que l’exemple ci-dessous aide à comprendre ceci: En Java, chaque fois que nous cherchons des informations précises pour une opération, par exemple si nous faisons un double num1 = 10e + 102; double num2 = 8e + 10; resultat = num1 + num2;

  The output will be so long and not precise, becasue it is precissed by the hardware eg JVM and JIT has the license as long as we dont have specify it Ssortingctfp Marking it Ssortingctfp 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 dissortingbuted application (or multiplayer game) where all floating-point calculations need to be deterministic no matter what the underlying hardware or CPU is.