我正在制作一个玩具物理引擎,它可以使用我称之为实数的浮点数。
目前,我正在使用typedef;
typedef float real;
这样我可以将浮点值的精度更改为double或long double,但显然我必须重新编译。我希望能够在运行时干净地定义真实的类型,以便我可以通过命令行或初始化GUI界面指定精度。
我知道typedef是在编译时确定的,所以我想知道是否有人有任何干净的想法。
答案 0 :(得分:2)
正如@Kerrek SB指出的那样,我不确定在float
s上使用double
会有多大优势。
我不能在没有看到你的代码的情况下明确地说出来,但你可以用模板做你想做的事。
template <typename T>
T Crunch1(T rhs)
{
// do something with 'rhs' and return the result
}
template <typename T>
T Crunch2(T lhs, T rhs)
{
// do something with 'lhs' & 'rhs' and return the result
}
这仍然是编译时而不是运行时多态,但可能是最接近你想要的东西。
并且,您可以创建一系列插件(每个所需精度一个插件)并在运行时按照您的建议选择。每个插件都是特定精度的模板代码的实例化。模板和插件架构的组合将为您提供所需的灵活性,而不会出现您显然要避免的代码重复。
答案 1 :(得分:2)
浮点数使用的内存少于双精度,而且精度较低。
但是,只有一组数学库,它是基于双重的。所有浮点数都会转换为double用于计算,然后必须转换为浮动。
只需使用双打。