编译并运行我的代码;如果您使用带有小数值的整数或浮点数,则比较结果。为什么会有区别?
这是我的代码:
#include <iostream>
using namespace std;
template<class T>
T find(T array[], T len, T num){
for (int i = 0; i < len; ++i){
if (array[i] == num)
return i;
}
return -1;
}
int main () {
int array1[5] = { 4, 7, 3, 5, 6 }, num1;
float array2[5] ={121.2, 111.5, 300.1, 500.1, 600.1 }, num2;
cout << "Enter an int:" << " " ;
cin >> num1;
cout << "Enter a float:" << " " ;
cin >> num2;
int x = find<int>(array1,5,num1);
float y= find<float>(array2,5,num2);
cout << "The index for the int is:" << " " << x << endl;
cout << "The index for the float is:" << " " << y << endl;
return 0;
}
使用整数和使用浮点数时,我找不到两个结果之间的区别。
答案 0 :(得分:4)
问题是由于浮点数的内部表示,您不能将浮点数与==
进行比较。如果您正在使用表达式的结果,则在数学上找到数组中的数字是正确的,但由于浮点表示的限制,==
将无法找到它。
请考虑以下代码:
template<class T>
int find(T array[], size_t len, T num){
for (size_t i = 0; i < len; ++i){
cerr << std::setprecision(7) << "Compare: " << array[i] << ", " << num;
if (array[i] == num) {
cerr << " => equal" << endl;
return i;
} else {
cerr << " =>not equal" << endl;
}
}
return -1;
}
int main () {
float array2[2] ={500.1, 1.0 }, num2;
float a = 500.1 / 2;
int i = find<float>(array2, 2, 2*a);
a = 1.0 / 0.3333;
i = find<float>(array2, 2, a * 0.3333);
return 0;
}
输出:
Compare: 500.1, 500.1 => equal
Compare: 500.1, 0.9999999 =>not equal
Compare: 1, 0.9999999 =>not equal
所以,即使1.0 / 0.3333 * 0.3333
在数学上是1.0
,也不是在使用浮点算术时 - 而是0.99999
。因此,==
并未将数字视为上次比较中的数字。
要解决此问题,请将两个数字的差异与较小的epsilon
值进行比较。 float.h
为此显式定义了常量FLT_EPSILON
:
if (fabs(array[i] - num) < FLT_EPSILON) { ...