为什么在第2-6行收到此编译器警告消息?
警告C4244:"return":从"double"转换为"float",可能丢失数据
inline float SIGN(const double &a, const float &b)
{return b >= 0 ? (a >= 0 ? a : -a) : (a >= 0 ? -a : a);}
inline float pow (float x, double y) {return pow(double(x),y);}
inline float pow (double x, float y) {return pow(x,double(y));}
inline float atan2 (float x, double y) {return atan2(double(x),y);}
inline float atan2 (double x, float y) {return atan2(x,double(y));}
在C和C++中,float
类型的精度低于double
类型。您已经将函数声明为返回浮点,但这些函数使用的是double。混合数字类型的规则在这里适用,当您组合它们时,一些类型会被无声地转换。
函数内部计算的结果是二重的,然后作为浮点从函数返回。编译器警告您,从函数内部返回的double类型中的值可能不适合函数的返回类型float
,并且在转换过程中可能会丢失一些精度。否则,它不会明确警告您混合float和double。但如果将int
和double
混合使用,则可能会出现这种情况。
在现代(不到10岁(的台式机或服务器硬件上使用浮点型几乎没有什么价值。