模板化代码中的浮点常量
Floating point constants in templated code
我有一个对浮点参数进行操作的模板函数。函数是模板化的,因此调用方可以使用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){
}
}
虽然这目前没有造成任何问题,但我想知道通常的做法是什么。
我建议
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对于您的应用程序域来说足够小。
相关文章:
- 为什么代码段会引发浮点异常?
- 如何根据模板类型定义浮点常量?
- 这个代码的浮点错误有人能帮我吗
- 当没有浮点数据类型时,为什么此代码会出现浮点异常
- 将节点数组(可变长度)转换为常量浮点**以调用opencv.calcHist
- 将常量浮点*转换为垫子
- 在不同翻译单元中具有静态存储持续时间的依赖非局部常量浮点变量的常量初始化
- 浮点常量不精确的警告
- 模板元编程和浮点常量系数
- 如何编写浮点常量
- 为什么在C++17中使用十六进制浮点常量
- 如何在模板中定义浮点常量.避免在运行时强制转换
- 浮点常量的编译时转换
- C++浮点常量总是存储在静态内存中吗
- 声明浮点常量时出错
- 如何初始化类内浮点常量
- C/ c++中浮点常量的紧凑无损表示
- 在MATLAB中用十六进制浮点常量解析文件
- 浮点限制代码不能产生正确的结果
- 模板化代码中的浮点常量