比较C中的浮点数

时间:2016-10-29 14:26:23

标签: c floating-point precision floating-accuracy

假设您已获得此代码摘录:

示例1:

printf("Enter two real numbers: ");
scanf("%f %f", &a, &b);

if (a == b) //do something

我的问题是: 在比较直接从键盘上拍摄的花车时是否有必要使用一些“安全措施”?

例如,如果我给出类似的代码:

示例2:

printf("Enter two real numbers: ");
scanf("%f %f", &a, &b);
float x = a / b + 2 * a / 3;
float y = b / a + 3 * a / 2;
if (x == y) //do something

我知道我应该使用:

fabs(x - y) < RefValue

if if条件只是为了避免 false 的潜在发生,即使结果应该是 true 但是我也必须在示例1中这样做吗?

2 个答案:

答案 0 :(得分:4)

可以非常安全地假设在完全相同的字符表示中使用相同输入法从键盘输入的两个数字最终为相同的二进制数。这与 precision 完全无关 - 毕竟,这是再现性,这是我们依赖的计算机程序最固有的特性之一。这两个数字可能不精确并且不完全代表输入,但它们必须相同。简而言之,您的示例1 有效。

甚至可能(但不能保证)不同的字符表示最终处于相同的二进制数,这可能是由于并非所有十进制数都在内部FP中具有精确表示格式。但是,这不会影响您的比较,因为除了使用不同的内部表示外,您无法做很多事情。

答案 1 :(得分:0)

从键盘上取float没有任何意义,因为它本身就不如其他任何float精确。话虽如此,在从键盘上取float时,你冒着两个不同的数字被存储为相同值的风险,因为两个数字之间的差值小于单精度浮点数的epsilon。但是,这与浮动的任何其他用法没有什么不同。总而言之,从float获得的scanf与任何其他float没有区别,您通常使用或不会使用的任何安全措施也应与这些花车一起使用。< / p>