大部分情况下变量的数据类型都是显而易见的,但是当有多种类型都能用时,表面上看没区别,真正用起来就不一样了。
先看下面这个例子。
实现一:
poRad(CPoint p)
{
double result;
if (p.x == 0)
{
if (p.y >= 0)
{
result = 1.5708;
}
else
{
result = -1.5708;
}
}
else
{
double dTan;
dTan = double(-p.y / p.x);
result = atan(dTan);
}
if (p.x <= 0)
{
result = result + 3.1416;
}
return result;
}
实现二:
poRad(CPoint p)
{
double result;
if (p.x == 0)
{
if (p.y >= 0)
{
result = 1.5708;
}
else
{
result = -1.5708;
}
}
else
{
double dTan;
dTan = double(((double)-p.y / (double)p.x));
result = atan(dTan);
}
if (p.x <= 0)
{
result = result + 3.1416;
}
return result;
}
大家试一下,实现一并不能每次都出正确的结果。由于数据类型的选择,有些时候的类型转换导致的精度丢失等问题,造成了结果和我们预期的有很大出入。
如果这个例子中传入的是 double x,y 或者 float x,y 就不会有这个问题了。
还有一个例子就是前几天调试别人翻译java的一段程序。功能就是对像素的RGB值分别作边界检测统计,也就是根据一个点周围各点的值从新取他的值。其中就有求和再平均的操作。由于RGB最大都是255一般都是BYTE表示就够了,所以RGB 以及他们的均值都用BYTE,但顺手就把sum也声明为BYTE,最后的结果就是值溢出了,导致最后的均值都不对。
像这种疏忽,在比较急的情况下经常发生,出了问题首先想到的就是算法哪个地方实现的不对,最后找都问题时都是哭笑不得。
所以,平时code时还是不要太毛躁,心急吃不了热豆腐,每行代码好好考虑下,养成好习惯,比风风火火写完后,再满头大汗得调试好多了。