模板代码中的浮点常量

时间:2011-05-28 14:38:46

标签: c++ templates floating-point

我有一个模板函数在浮点参数上运行。该函数是模板化的,因此调用者可以使用floatdouble或任何其他浮点数据类型。

在我的代码中的某一点,我将一个值与零(或任何其他浮点常数)进行比较。我应该使用0.00.0f进行比较吗?

template<T> void f(T a){
  //  should I use 0.0 or 0.0f in the following line?
  if(a == 0.0){
  }
}

虽然目前没有引起任何问题,但我想知道通常的做法是什么。

3 个答案:

答案 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对你的应用程序域来说足够小。