比较 C 中的浮点数
Comparing floats in C
假设您获得了这段代码摘录:
示例 1:
printf("Enter two real numbers: ");
scanf("%f %f", &a, &b);
if (a == b) //do something
我的问题是:在比较直接从键盘获取的浮点数时是否有必要使用一些"safety measures"?
例如,如果我得到类似的代码:
示例 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
for if 条件只是为了避免 false 的潜在发生,即使结果应该是 true。 但是在示例 1 中我也必须这样做吗?
从键盘上输入 float
并不会使它本质上不如任何其他 float
精确。话虽如此,在从键盘上输入 float
时,您 运行 将两个不同的数字存储为相同值的风险,因为这两个数字之间的差异小于单个数字的 epsilon精度浮动。但是,这与浮点数的任何其他用法没有什么不同。总之,从 scanf
获得的 float
与任何其他 float
没有什么不同,您通常会或不会使用的任何安全措施也应该与这些浮标一起使用。
可以很安全地假设从键盘使用相同的输入法输入的两个数字在完全相同字符表示中最终会作为相同的二进制数。这与 精度 完全无关——毕竟,那是 可再现性,这是我们所依赖的计算机程序最固有的特征之一。这两个数字可能 不精确 并且不能完全代表输入,但它们必须相同。简而言之,您的示例 1 是有效的。
甚至有可能(但不保证)不同的字符表示最终会出现相同的二进制数,这是由于并非所有十进制数都具有精确的二进制数以内部 FP 格式表示。不过,这不会影响您的比较,因为除了使用不同的内部表示之外,您无能为力。
假设您获得了这段代码摘录:
示例 1:
printf("Enter two real numbers: ");
scanf("%f %f", &a, &b);
if (a == b) //do something
我的问题是:在比较直接从键盘获取的浮点数时是否有必要使用一些"safety measures"?
例如,如果我得到类似的代码:
示例 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
for if 条件只是为了避免 false 的潜在发生,即使结果应该是 true。 但是在示例 1 中我也必须这样做吗?
从键盘上输入 float
并不会使它本质上不如任何其他 float
精确。话虽如此,在从键盘上输入 float
时,您 运行 将两个不同的数字存储为相同值的风险,因为这两个数字之间的差异小于单个数字的 epsilon精度浮动。但是,这与浮点数的任何其他用法没有什么不同。总之,从 scanf
获得的 float
与任何其他 float
没有什么不同,您通常会或不会使用的任何安全措施也应该与这些浮标一起使用。
可以很安全地假设从键盘使用相同的输入法输入的两个数字在完全相同字符表示中最终会作为相同的二进制数。这与 精度 完全无关——毕竟,那是 可再现性,这是我们所依赖的计算机程序最固有的特征之一。这两个数字可能 不精确 并且不能完全代表输入,但它们必须相同。简而言之,您的示例 1 是有效的。
甚至有可能(但不保证)不同的字符表示最终会出现相同的二进制数,这是由于并非所有十进制数都具有精确的二进制数以内部 FP 格式表示。不过,这不会影响您的比较,因为除了使用不同的内部表示之外,您无能为力。