模板化代码中的浮点常量

Floating point constants in templated code

本文关键字:浮点常量 代码      更新时间:2023-10-16

我有一个对浮点参数进行操作的模板函数。函数是模板化的,因此调用方可以使用floatdouble或任何其他浮点数据类型。

在代码的某一点上,我将一个值与零(或任何其他浮点常量)进行比较。我应该使用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){
  }
}

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

我建议

if (a == T(0)) ...

我建议简单地使用0。根据数字类型的升级规则,0将升级为浮点操作数a的类型。常量的提升是一种编译时转换,它不会减慢程序的运行速度。


另一方面,使用0.0将强制另一个操作数的运行时转换为双倍,这可能不是问题,因为操作数很可能是在FPU寄存器中传递的。0.0f不会导致浮点操作数的转换,但如果模板曾与整型一起使用,则会在运行时转换为float

您不应该将浮点数上的相等性与简单进行比较

if (value == 0.0) // or 0.0f, doesn't matter

因为大多数时候它不会产生你所期望的结果。您应该检查value是否足够接近您期望的数字。即:

if (abs(value - 0.0) < epsilon) 

其中epsilon对于您的应用程序域来说足够小。