使用float而不是double编译c代码

时间:2014-07-11 01:37:50

标签: gcc floating-point

我有一个用C编写的冗长数值积分方案。我想以浮点精度测试我的算法。有没有办法告诉gcc在整个程序中降级doublefloat的每一次?

2 个答案:

答案 0 :(得分:4)

如果不修改源代码,就无法安全地执行此操作,但这不应该非常困难。

使用预处理器强制将程序中的关键字double视为float是一个坏主意;这将使您的程序难以阅读,如果您碰巧在任何地方使用long double,它将被视为long float,这是语法错误。

正如stix's answer建议的那样,您可以在程序的顶部添加typedef(如果它是单个源文件),也可以添加#include所有的typedef double real; /* or pick a different name */ 标题相关的源文件:

double

然后浏览您的源代码并将每次real更改为 typedef float real; 。 (小心做盲目的全局搜索和替换。)

确保程序在此更改后仍然以相同的方式编译,运行和行为。然后您可以将typedef更改为:

float

并重新编译以使用double而不是<math.h>

然而,这并不是相当。如果您正在使用sqrt()中声明的函数,那么您将需要使用正确的函数来处理您正在使用的任何浮点类型;例如,double适用于sqrtf()float适用于sqrtl()long double适用于<tgmath.h>

如果您的编译器支持它,您可以使用<math.h>标头,该标头定义与<tgmath.h>中的数学函数对应的 type-generic宏。如果您使用sqrt(x),那么{{1}}将解析调用正确的平方根函数,具体取决于参数的类型。

答案 1 :(得分:0)

typedef double float; 

在你想要替换的任何双打之前应该工作,但是要警告它可能会混淆一些外部库。

将来,最好的方法是定义自己的浮点类型:

#ifdef USE_FLOATS
    typedef float MyFloatType; 
#else 
    typedef double MyFloatType;
#endif

或者使用模板,它具有允许您在运行时更改代码以使用其中一个的额外好处。