获得相同的常量,为浮点数或双精度工作



我允许一个大型代码库通过一个类型定义在单浮点精度和双浮点精度之间交替。目前,我的代码是双向的:

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;
}

最新更新