我有一个用C编写的冗长数值积分方案。我想以浮点精度测试我的算法。有没有办法告诉gcc在整个程序中降级double
到float
的每一次?
答案 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
或者使用模板,它具有允许您在运行时更改代码以使用其中一个的额外好处。