【发布时间】:2011-12-21 00:41:44
【问题描述】:
我应该如何在我的代码中处理多种数据类型的可能性?
我希望可以使用 double 或 float 类型进行编译,这是我目前使用的代码:
#define USE_FLOAT_PRECISION
...
#ifdef USE_FLOAT_PRECISION
typedef float DATATYPE;
#define GL_DATATYPE GL_FLOAT
#else
typedef double DATATYPE;
#define GL_DATATYPE GL_DOUBLE
#endif
...
DATATYPE somevar;
...
for(...){
for(...){
...
somevar *= (DATATYPE)1.02; // is this good?
...
}
}
...
glVertexPointer(3, GL_DATATYPE, ... // can this be done better?
...
这很好用,但我觉得在我使用它的每个地方都使用 (DATATYPE) 进行强制转换有些不好,而且看起来也很丑,为每个地方粘贴它会很烦人。还有其他解决方案吗?
编辑: 我担心转换为(DATATYPE) 的原因是因为我需要在我的代码中以双精度表示浮点值,但稍后将其转换为 (float),所以恐怕从 double 转换为 float 会导致一些问题。我也不确定它是否有效,我听说 static_cast 更快或什么的。但我不确定我为什么要使用它,我应该在这里使用它。
【问题讨论】:
-
这和我过去看到的差不多。唯一的区别是使用函数样式的宏进行访问:DATATYPE_CREATE(0.5)。这使您不仅可以为浮点类型实现强制转换。例如。它可以是一个没有硬件浮点的平台上的类。
-
听起来像是模板的工作,不是吗?
-
编译器应该在编译时将常量转换为浮点数。此外,您可能需要额外的宏来处理 sprintf 类型的东西,以区分 %f 和 %Lf
-
@Hybrid, %f 适用于双精度和浮点数,到目前为止没有问题。
-
你能给我们展示一个在内部使用双精度的 OpenGL 实现吗?
标签: c++ windows visual-c++ opengl