2012-03-31 17 views
5

Estoy en el proceso de crear un programa que genere vectores de prueba para usar en un banco de pruebas VHDL. El banco de pruebas esencialmente prueba una pieza de hardware que actúa como un único sumador de punto flotante de precisión, por lo que los vectores se ajustarán al estándar IEEE 754.¿Es peligrosa la conversión de flotador a BigDecimal y viceversa?

De todos modos, mi plan actual de generación es convertir los valores de flotación a BigDecimal, hacer el aritmático necesario, luego convertir de nuevo a flotación. ¿Esto es peligroso? ¿Se perderá la precisión dando como resultado un resultado potencialmente inexacto en el vector de prueba? Quiero convertir a BigDecimal, por lo que puedo evitar problemas de redondeo.

¿Esto truncaría el resultado?

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

Donde A y B flotan.

+0

Definitivamente perderá un poco de precisión ya que un flotador no puede representar todos los números fraccionarios posibles. – anubhava

+0

¿Hay alguna manera de lograr esto sin perder precisión? – Franklin

+1

¿Cuán preciso crees que es necesario que sea? –

Respuesta

5

Si su objetivo es tener vectores de flotación de 32 bits precisos dentro de las limitaciones esperadas de un flotador, entonces me gusta su enfoque. Primero está convirtiendo de un flotador de 32 bits a un objeto con mayor precisión, realizando varios pasos para su matemática y luego convirtiendo de nuevo a punto flotante de 32 bits. Al final, sus errores de redondeo probablemente sean menores que si hubiera realizado la misma serie de pasos de forma nativa en sus carrozas de 32 bits.

Si su objetivo es simular con precisión los resultados esperados de una pieza de hardware que realiza cálculos de forma nativa utilizando flotadores de 32 bits, puede correr el riesgo de informar fallas de prueba falsamente porque sus cálculos se realizan con mayor precisión que el hardware que se prueba.

+0

He editado mi pregunta. Estoy pensando ¿verdad? – Franklin

+0

Según su ejemplo, no veo que haya evitado los problemas de redondeo. Si solo está generando aleatoriamente vectores como flotadores, convirtiéndolos en cadenas, convirtiendo cadenas en BigDecimal, agregando, luego convirtiendo nuevamente en flotantes, entonces no será mejor que simplemente agregar los flotadores. – phatfingers

+0

Ver la pieza de hardware que se modela trunca los valores en lugar de redondear. Entonces, parte de mi software es generar vectores aleatorios junto con casos extremos. No puedo redondear el resultado o las pruebas serán inútiles ya que el hardware se trunca. – Franklin

Cuestiones relacionadas