C++ 使相同的常量用于浮点或双精度浮点

C++ 使相同的常量用于浮点或双精度浮点,c++,C++,我通过一个typedef使大型代码库能够在单浮点精度和双浮点精度之间交替。目前,我的代码是双向的: 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;

我通过一个typedef使大型代码库能够在单浮点精度和双浮点精度之间交替。目前,我的代码是双向的:

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构造函数调用,从而仅为解决编译器警告而向我收取速度惩罚?我想不会,因为从fTypeCONSTANT到CONSTANTf的编译时重写似乎微不足道。但我想绝对肯定。我使用VC,但我想知道C++编译器的一般性。 还有,有比我更优雅的解决方案吗?当一个表达式中包含大量常量时,fpType调用会变得丑陋:

fpType someVal = fpType(1.0)/(someOtherVal+fpType(0.5))*(someVal      
/fpType(7.66))*fpType(43.33);
我希望有特定于编译器的方法来解决这个问题,但我寻求一种编译器无关的方法,如果它存在的话。当然,我只会把警告镇压作为最后手段,也许根本不会

[编辑]
我写了一个关于直接初始化的问题,解释如下。

您可以尝试使用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;
}

您可以尝试使用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;
}

对于文本常量,可以使用float类型。转换为double时不会出现任何编译器警告

fpType foo(fpType input)
{
    return 1.0f/input;
}

是否有可能在运行时执行显式POD构造函数调用?不,你收到了什么样的警告?我的g++甚至没有抱怨-pedantic。当你提到POD构造函数调用时,你是指fpType1.0吗?如果是这样的话,这是一个强制转换,而不是构造函数调用。static_cast1.0可能是一个更好的选择。而且不,使用它没有运行时命中率。@Andy:是的,这是一个说法。你是说floatK是floatK的语义糖吗?是否有可能在运行时执行显式的POD构造函数调用?不,你收到了什么样的警告?我的g++甚至没有抱怨-pedantic。当你提到POD构造函数调用时,你是指fpType1.0吗?如果是这样的话,这是一个强制转换,而不是构造函数调用。static_cast1.0可能是一个更好的选择。而且不,使用它没有运行时命中率。@Andy:是的,这是一个说法。你是说floatK是floatK的语义糖吗?酷-绝对比我做的好。酷-绝对比我做的好。