关于调试中模板实例赋值给变量值得问题,d得值为什么是这样得?
(vs2003-debug)
#include <iostream>
using std::cout;
template <typename Type, int size>
Type min( Type (&r_array)[size] )
{
Type min_val = r_array[0];
for ( int i = 1; i < size; ++i )
if ( r_array[i] < min_val )
min_val = r_array[i];
return min_val;
}
// size 没有指定——ok
// size = 初始化表中的值的个数
int ia[] = { 10, 7, 14, 3, 25 };
double da[6] = { 10.2, 7.1, 14.5, 3.2, 25.0, 16.8 };
#include <iostream>
int main()
{
// 为5 个int 的数组实例化min()
// Type => int, size => 5
int i = min( ia );
if ( i != 3 )
cout < < "??oops: integer min() failed\n ";
else cout < < "!!ok: integer min() worked\n ";
// 为 6 个 double 的数组实例化 min()
// Type => double, size => 6
double d = min( da );//调试中查看d=3.2000000000000002 ???
if ( d != 3.2 )
cout < < "??oops: double min() failed\n ";
else cout < < "!!ok: double min() worked\n ";
return 0;
}
[解决办法]
千万要留意,无论是float还是double类型的变量,都有精度限制。所以一定要避免将浮点变量用“==”或“!=”与数字比较,应该设法转化成“> =”或“ <=”形式。
假设浮点变量的名字为x,应当将
if (x == 0.0) // 隐含错误的比较
转化为
if ((x> =-EPSINON) && (x <=EPSINON))
其中EPSINON是允许的误差(即精度)。
[解决办法]
去搜索IEEE的浮点表示的资料吧。