我有一个模板函数在浮点参数上运行。该函数是模板化的,因此调用者可以使用float
,double
或任何其他浮点数据类型。
在我的代码中的某一点,我将一个值与零(或任何其他浮点常数)进行比较。我应该使用0.0
或0.0f
进行比较吗?
template<T> void f(T a){
// should I use 0.0 or 0.0f in the following line?
if(a == 0.0){
}
}
虽然目前没有引起任何问题,但我想知道通常的做法是什么。
答案 0 :(得分:13)
我建议
if (a == T(0)) ...
答案 1 :(得分:7)
我建议只0
。根据数字类型的升级规则,0
将被提升为浮点操作数a
的类型。提升常量是一个编译时转换,它根本不会减慢你的程序。
另一方面,使用0.0
将强制将另一个操作数的运行时转换为double,这可能不是问题,因为操作数最有可能在FPU寄存器中传递。 0.0f
不会导致浮点操作数的转换,但如果模板曾使用整数类型,则会将运行时转换为float
。
答案 2 :(得分:1)
您不应该将浮点数的相等性与简单的
进行比较if (value == 0.0) // or 0.0f, doesn't matter
因为大多数时候它不会产生你期望的结果。您应该检查value
是否足够接近您期望的数字。那就是:
if (abs(value - 0.0) < epsilon)
其中epsilon对你的应用程序域来说足够小。