从float转换为BigDecimal然后再转回去是否危险?

5
我正在制作一个程序,用于生成VHDL测试台中使用的测试向量。这个测试台主要用于测试单精度浮点加法器,因此生成的向量将符合IEEE 754标准。
目前,我计划采用将浮点值转换为BigDecimal,进行必要的算术运算,然后再转换回浮点数。但这样做是否存在风险?会不会丢失精度,从而在测试向量中导致不准确的结果?我想采用BigDecimal进行转换,以避免舍入问题。
因此,这样做是否会截断结果?
BigDecimal repA = new BigDecimal(Float.toString(A));
BigDecimal repB = new BigDecimal(Float.toString(B));
BigDecimal repResult = repA.add(repB);
float result = repResult.floatValue();

A和B是一些浮点数。


由于浮点数无法表示所有可能的小数,因此您肯定会失去一些精度。 - anubhava
有没有一种方法,可以在不失去精度的情况下完成这个任务? - Franklin
1
你认为它需要多准确? - Dave Newton
我想这是相对的。如果可能,我希望能够实现100%的准确性。 - Franklin
2
你所要求的是不可能的 - 一些浮点数加法本质上会遇到“舍入问题”(例如,将一个非常小的数字加到一个大得多的数字中); 测试加法器正确性的一部分将是确保它以符合规范的方式进行舍入。 - user149341
1个回答

6
如果你的目标是在float的预期限制内获得准确的32位浮点向量,那么我喜欢你的方法。首先将32位浮点数转换为高精度对象,对数学进行多个步骤处理,然后再转换回32位浮点数。最终,你的舍入误差可能会比如果你在32位浮点数中本地执行相同系列步骤时要低。
如果你的目标是准确模拟使用32位浮点数进行计算的硬件的预期结果,那么你可能会冒着错误地报告测试失败的风险,因为你的计算精度比正在测试的硬件更高。

根据你的示例,我没有看到你避免了任何舍入问题。如果你只是随机生成浮点向量,将它们转换为字符串,将字符串转换为BigDecimal,相加,然后再转换回浮点数,那么你不会比直接相加浮点数更好。 - phatfingers
看一下被建模的硬件部分,它截断值而不是四舍五入。因此,我的软件的一部分是生成随机向量以及边缘情况。如果结果被四舍五入,测试将毫无意义,因为硬件会进行截断。 - Franklin
我需要先进行计算,然后检查 BigDecimal 的小数部分是否适合23位?如果不适合,就将其截断并转换吗? - Franklin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接