2012-03-31 1 views
5

Je suis en train de créer un programme qui génère des vecteurs de test à utiliser dans un banc de test VHDL. Le banc d'essai teste essentiellement un composant matériel agissant comme un additionneur à virgule flottante simple précision, de sorte que les vecteurs seront conformes à la norme IEEE 754.Est-il dangereux de convertir float en BigDecimal puis en arrière?

Quoi qu'il en soit, mon plan actuel pour la génération est de convertir les valeurs float à BigDecimal, faire l'arithmétique nécessaire, puis convertir en flottant. Est-ce dangereux? La précision sera-t-elle perdue, entraînant un résultat potentiellement inexact dans le vecteur de test? Je veux convertir en BigDecimal, donc je peux éviter les problèmes d'arrondi.

Est-ce que cela tronquerait le résultat?

BigDecimal repA = new BigDecimal(Float.toString(A)); 
BigDecimal repB = new BigDecimal(Float.toString(B)); 
BigDecimal repResult = repA.add(repB); 
float result = repResult.floatValue(); 

Où A et B sont un certain flottant.

+0

Vous allez certainement perdre de la précision car un flotteur ne peut pas représenter tous les nombres fractionnaires possibles. – anubhava

+0

Y at-il un moyen que je pourrais accomplir cela en ne perdant aucune précision? – Franklin

+1

À quel point croyez-vous que vous en avez besoin? –

Répondre

5

Si votre objectif est d'avoir des vecteurs flottants précis de 32 bits dans les limites attendues d'un flottant, alors j'aime votre approche. Vous effectuez d'abord une conversion du flottant 32 bits en un objet avec une précision plus élevée, en effectuant plusieurs étapes à vos calculs, puis en convertissant à nouveau en virgule flottante 32 bits. En fin de compte, vos erreurs d'arrondi seraient probablement plus faibles que si vous aviez effectué la même série d'étapes natives dans vos flottants 32 bits. Si votre objectif est de simuler avec précision les résultats attendus d'un composant exécutant des calculs de manière native avec des flottants 32 bits, vous risquez de signaler une erreur de test erronée car vos calculs sont effectués avec plus de précision. que le matériel testé.

+0

J'ai édité ma question. Est-ce que je pense bien? – Franklin

+0

Selon votre exemple, je ne vois pas que vous avez évité les problèmes d'arrondi. Si vous générez aléatoirement des vecteurs comme des flottants, les convertissez en chaînes, convertissez les chaînes en BigDecimal, ajoutez, puis convertissez les en flottants, alors vous ne serez pas mieux loti que d'ajouter les flottants. – phatfingers

+0

Voir le morceau de matériel modélisé tronque les valeurs par opposition à rond. Donc, une partie de mon logiciel est de générer des vecteurs aléatoires avec des cas de bord. Je ne peux pas arrondir le résultat sinon les tests seront inutiles puisque le matériel est tronqué. – Franklin

Questions connexes