获得相同的常量,为浮点数或双精度工作
Getting same constants to work for floats or doubles
我允许一个大型代码库通过一个类型定义在单浮点精度和双浮点精度之间交替。目前,我的代码是双向的:
double foo(double input)
{
return 1.0/input;
}
简单地切换到程序员指定的精度是这样的:
#ifdef _USE_DOUBLES
typedef double fpType;
#else
typedef float fpType;
#endif
fpType foo(fpType input)
{
return 1.0/input;
}
显然,"1.0"会引起编译器警告。到目前为止,我的最佳解决方案是这样处理每个常量:
fpType foo(fpType input)
{
return fpType(1.0)/input;
}
是否有可能显式的POD构造函数调用实际上会在运行时执行,从而收取我的速度惩罚只是为了解决编译器警告?我怀疑不是,因为编译时从"fType(CONSTANT)"重写为"CONSTANTf"似乎微不足道。但我想百分百确定。我使用VC,但我想了解一般的c++编译器。
还有,有没有比我的更优雅的解决方案?当大量常量出现在一个表达式中时,fpType()调用会变得很难看:
fpType someVal = fpType(1.0)/(someOtherVal+fpType(0.5))*(someVal
/fpType(7.66))*fpType(43.33);
我希望有特定于编译器的方法来解决这个问题,但我寻求一个与编译器无关的方法,如果它存在的话。当然,我只把警告镇压作为最后的手段,也许根本不是。
[编辑]我在写这个问题时误解了"直接初始化",这在CPP中基本数据类型的构造函数初始化中有解释。
您可以尝试c++ 11用户自定义文字:
#include <iostream>
#ifdef USE_DOUBLES
constexpr double operator"" _f (double value)
{
return value;
}
#else
constexpr float operator"" _f (double value)
{
return value;
}
#endif /*USE_DOUBLE*/
using namespace std;
int main()
{
cout << 1.2_f << endl;
}
对于文字常量,您可以使用float
类型。到double
的转换将在没有任何编译器警告的情况下进行。
fpType foo(fpType input)
{
return 1.0f/input;
}
相关文章:
- 在C++中序列化浮点数/双精度,编译为 WebAssembly
- 如何提高计算浮点数的精度?
- 我们如何清楚地知道 C/C++ 中的双精度或浮点数的精度?
- 这是为浮点数/双精度函数泛型的正确方法吗?
- 关于在C/C++中比较整数和浮点/双精度
- 如何在没有浮点数/双精度数的情况下生成均匀和高斯分布的伪随机数
- 具有 IEEE 754 浮点双精度数据类型的安全往返整数值
- 将浮点浮点/双精度的其余部分转换为整数
- 为什么在C和C++中没有浮点/双精度的除法余数运算
- 使用浮点/双精度作为循环变量
- 字符数据浮点数/双精度数
- 宏或函数,用于根据给定的符号、尾数和指数构造浮点(双精度)
- C++将SATOSHI(uint64_t)转换为不带浮点/双精度的BTC(string)
- C++将字符串转换为浮点/双精度,而不会丢失数据
- 将输入字符串转换为浮点/双精度C++
- 在运行时定义双精度或浮点数的精度/大小
- 整数和分数为浮点数/双精度
- 在c++中控制浮点数的精度
- c++中浮点数/双精度数的比较
- 以 32 个十进制数字分析浮点数/双精度