6
votes

Java Maths - Test de NaN

Je voudrais avoir une sorte de mécanisme rapide de l'échec à l'échelle du projet (peut-être un RunTimeException ) pour tout code qui provoque l'affectation de NAN .

dans mon projet nan n'est jamais une valeur valide.

Je réalise que je pourrais ajouter des affirmations (en utilisant Isnan ) ou d'autres tests tout au long, mais je veux savoir s'il y a une manière plus élégante.


2 commentaires

Que prévoyez-vous réellement de faire?


Ce que i voudriez faire est de savoir exactement où un calcul numérique compliqué passe mal, sans diffusion iSnan tests sur le code. Dans de nombreux autres environnements, je peux utiliser IEEE 754 pièges , mais Pas sur le JVM .


5 Réponses :


4
votes

Non - parce que nan est une valeur valide, l'utilisation de celle-ci ne fera aucune exception. Sans aucun mécanisme de surveillance omniprésente à utiliser, vous devez tester explicitement les points où il pourrait être attribué ou renvoyé d'une méthode.


0 commentaires

2
votes

Si vous êtes prêt à sacrifier les performances de l'application, vous pouvez créer une enveloppe pour double (ou autre objet numérique que vous souhaitez utiliser) et lancer une exception lorsque nan est défini.


0 commentaires

4
votes

Oui, vous pouvez utiliser AspectJ (programmation orientée forme) pour lancer une erreur chaque fois qu'une valeur est définie sur Nan.

essentiellement, vous souhaitez intercepter chaque fois qu'une valeur est définie et effectuer une autre fonction.

Nous avons fait des choses similaires dans notre codebase ... mais je ne peux pas vous donner beaucoup d'aide en dehors de cela.


0 commentaires

2
votes

Techniquement, il serait possible de créer un agent pour le faire par Inscription Le code en question pour injecter affirmer ou si teste automatiquement. Cela impliquerait un peu d'inspection et de transformation de bytecode (par exemple en utilisant ASM ). À mon avis, cela prendrait des circonstances extraordinaires pour le justifier. Vous devez faire attention à ne pas instruminer des classes qui s'appuient sur la possibilité de traiter nan en interne.

Je ne suis pas conscient que quiconque a écrit un tel agent. Si vous cherchez une balle d'argent, je ne pense pas qu'il y en a un.


0 commentaires

2
votes

Une autre approche - vous pouvez intégrer des dames de code tels que PMD dans votre processus de construction et créez une règle qui rapporte chaque affectation de double.Nan .

Ce ne sera pas parfait, car il ne peut pas attraper la nan, vous obtenez de l'extérieur (base de données, connexions) ou que quelqu'un crée une manipulation de bits, mais au moins vous pouvez assurer que double.Nan On ne peut pas être attribué à une variable ou être utilisé comme paramètre de méthode ou à l'intérieur d'une évaluation.

Définition des règles pourrait être difficile - mais au moins - c'est une autre approche. La règle la plus simple pourrait être d'interdire double.Nan du tout.


0 commentaires