Je suis en train d'effectuer certaines conversions de type de données où je dois représenter uint
, long
, ulong
et decimal
en tant que valeurs à virgule flottante IEEE 754. Je veux être en mesure de détecter si le type de données IEEE 754 ne peut pas contenir la valeur avant d'effectuer la conversion.Comment tester si la conversion numérique va changer la valeur?
Une solution de force brute serait d'enrouler un try-catch autour d'un plâtre pour doubler la recherche de OverflowException
. La lecture de certains des CLR documentation implique que certaines conversions changent silencieusement la valeur sans aucune exception.
Y at-il un moyen infaillible de faire cette vérification? Je suis à la recherche de complétude sur la facilité de mise en œuvre. Je sens que je vais être lire attentivement l'IEEE 754 spécifications et le contrôle Matissa et l'exposant soigneusement ...
Je dois ajouter que je suis le plus concerné de représenter des nombres entiers avec précision et que la perte de flotter la précision ponctuelle est secondaire (mais mérite d'être considérée).
EDIT: Int32 peut être entièrement exprimé en tant que IEE-754. Le type de données Decimal
fait également partie de la question.
Mise à jour importante: si vous faites référence à cette question, vous devriez également lire cette question: IEEE-754 Double (64-bit floating point) vs. Long (64-bit Integer) Revisited
Il note une faille dans la réponse où certaines valeurs très importantes sont également en mesure d'être exactement représenté par l'IEEE -754. Bien que cela puisse signifier que la valeur sera correctement aller-retour, pour mon but original (va-t-il aller-retour à JavaScript), il ne sera pas.
Il semble également y avoir un bogue dans le type CLR System.Double car il n'autorise pas correctement ces valeurs à aller-retour.
Si vous voulez éviter le débordement, vous pouvez vérifier que votre valeur est comprise entre MinValue et MaxValue du type cible avant la conversion. Si vous voulez éviter le problème de précision, n'utilisez pas de nombres à virgule flottante. – Guillaume