Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从float转换为BigDecimal然后再转换回BigDecimal是否危险?_Java_Floating Point_Bigdecimal_Ieee 754 - Fatal编程技术网

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

Java 从float转换为BigDecimal然后再转换回BigDecimal是否危险?,java,floating-point,bigdecimal,ieee-754,Java,Floating Point,Bigdecimal,Ieee 754,我正在制作一个程序,生成用于VHDL测试台的测试向量。测试台基本上测试一个充当单精度浮点加法器的硬件,因此向量将符合IEEE 754标准 无论如何,我当前的生成计划是将浮点值转换为bigdecimic,执行必要的算术运算,然后再转换回浮点值。这危险吗?精度是否会丢失,从而导致测试向量中的结果可能不准确?我想转换为BigDecimal,这样可以避免舍入问题 那么这会截断结果吗 BigDecimal repA = new BigDecimal(Float.toString(A)); BigDecim

我正在制作一个程序,生成用于VHDL测试台的测试向量。测试台基本上测试一个充当单精度浮点加法器的硬件,因此向量将符合IEEE 754标准

无论如何,我当前的生成计划是将浮点值转换为
bigdecimic
,执行必要的算术运算,然后再转换回浮点值。这危险吗?精度是否会丢失,从而导致测试向量中的结果可能不准确?我想转换为
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是一些浮点。

如果您的目标是在浮点的预期限制内获得准确的32位浮点向量,那么我喜欢您的方法。首先将32位浮点转换为精度更高的对象,对数学执行几个步骤,然后再转换回32位浮点。最后,舍入误差可能会低于在32位浮点中本机执行相同系列步骤时的舍入误差


如果您的目标是准确模拟使用32位浮点本机执行计算的硬件的预期结果,然后,您可能会冒错误报告测试失败的风险,因为您的计算比正在测试的硬件更精确。

由于浮点不能代表所有可能的小数,您肯定会失去一些精度。有没有一种方法可以通过不失去任何精度来实现这一点?精度如何你认为你需要它吗?我想这是相对的。如果可能的话,我希望100%的准确率。你所要求的是不可能的——一些浮点加法必然会遇到“舍入问题”(例如,将一个非常小的数字加到一个大得多的数字上);测试加法器正确性的一部分是确保它以兼容的方式进行舍入。根据您的示例,我看不出您避免了任何舍入问题。如果你只是随机生成向量作为浮点数,将它们转换为字符串,将字符串转换为BigDecimal,添加,然后再转换回浮点数,那么你不会比只添加浮点数更好。请参阅建模的硬件部分截断值而不是舍入值。所以我的软件的一部分是生成随机向量和边缘情况。我不能将结果四舍五入,否则由于硬件截断,测试将无效。我是否要进行计算,然后检查计算后的
BigDecimal
小数部分是否在23位以内?如果没有,则截断它并转换?