从浮动分配到浮动打印丢失的数据

时间:2019-02-05 10:16:35

标签: c unit-testing floating-accuracy

这是在测试期间出现的,我必须比较实际输出和预期输出之间的值。

代码:

float nf = 584227.4649743827f;
printf("Output: \t %.9f \n", nf);

输出:

Output:  584227.437500 

我在C语言方面的知识显然很薄弱,因此有人可以向我解释这种情况:

  1. 为什么印刷品中存在这种偏差(0.027474382659420f)?
  2. 这仅仅是打印限制吗?还是float数据类型限制?
  3. 哪个值实际存储在变量nf中?
  4. 我应该如何使用这样的值,以便在分配过程中不会丢失诸如0.027474382659420f偏差的信息。

与这种测试中的问题有关的任何其他建议也将得到广泛应用。

1 个答案:

答案 0 :(得分:4)

  

为什么印刷品中存在这种偏差(0.027474382659420f)?

因为float的准确度约为7位,并且您的偏差从第七位开始。

  

这仅是打印的限制,还是浮点数据类型   限制?

这是浮点数的限制,因此也包含double(尽管double的精度更高)。它也与二进制数和十进制数之间的转换有关,例如,0.2是二进制表示形式的重复十进制(很好,二进制),因此也有可能四舍五入错误,并且实际上可能会变成类似于0.200000000000000011

  

哪个值实际存储在变量nf中?

您看到的那个打印了。您指定的584227.4649743827f最有可能甚至不存在于已编译程序的二进制文件中,并且在编译期间会“转换”为实际使用的值。

  

我应该如何使用这样的值,以免丢失信息   例如在分配过程中的偏差为0.027474382659420f。

使用double,其精度约为15-17位数字。另外,您需要从f中删除584227.4649743827f,将其变成一个double常量。如果不够准确,则可能必须使用外部库代替任意精度数字,例如GMP

您的浮点数很可能符合IEEE 754标准,但不能保证。