读书人

关于调试中模板实例赋值给变量值得有关

发布时间: 2012-02-10 21:27:42 作者: rapoo

关于调试中模板实例赋值给变量值得问题,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的浮点表示的资料吧。

读书人网 >C++

热点推荐