Gcc 用float而不是double编译c代码
我有一个用C写的冗长的数值积分方案。我想用浮点精度测试我的算法。有没有办法告诉gcc将整个程序中每次出现的Gcc 用float而不是double编译c代码,gcc,floating-point,Gcc,Floating Point,我有一个用C写的冗长的数值积分方案。我想用浮点精度测试我的算法。有没有办法告诉gcc将整个程序中每次出现的double降级为float typedef double float; 在任何要替换的double开始工作之前,请注意,它可能会混淆某些外部库 将来,最好的方法是定义自己的浮动类型: #ifdef USE_FLOATS typedef float MyFloatType; #else typedef double MyFloatType; #endif 或者使用模
double
降级为float
typedef double float;
在任何要替换的double开始工作之前,请注意,它可能会混淆某些外部库
将来,最好的方法是定义自己的浮动类型:
#ifdef USE_FLOATS
typedef float MyFloatType;
#else
typedef double MyFloatType;
#endif
或者使用模板,这样做的另一个好处是允许您在运行时更改代码以使用其中一个。如果不修改源代码,您将无法安全地执行此操作,但这应该不会非常困难 使用预处理器强制将程序中的关键字
double
视为float
是个坏主意;这将使您的程序难以阅读,如果您碰巧在任何地方使用long double
,它将被视为long float
,这是一个语法错误
正如建议的那样,您可以在程序顶部(如果是单个源文件)或某个标题中添加typedef
,该标题包含所有相关源文件:
typedef double real; /* or pick a different name */
然后检查源代码并将每次出现的double
更改为real
。(进行盲全局搜索和替换时要小心。)
确保此更改后程序仍以相同的方式编译、运行和行为。然后,您可以将typedef更改为:
typedef float real;
并重新编译以使用float
而不是double
不过,这并不是那么简单。如果您使用的是
中声明的函数,那么无论您使用的是什么浮点类型,都需要使用正确的函数;例如,sqrt()
代表double
,sqrtf()
代表float
,sqrtl()
代表长双精度
如果您的编译器支持它,您可以使用
头,它定义了与
中的数学函数相对应的类型泛型宏。如果使用
,则sqrt(x)
将根据参数的类型解析调用正确的平方根函数。添加#是否在源代码中定义双浮点?不幸的是,-Ddouble=float
不起作用,因为它会影响系统头。GCC(Mac OS X 10.9.4上的4.9.0)不喜欢这样:X.c:1:16:错误:声明说明符中有两个或多个数据类型,其中X.c
包含单行typedef双浮点代码>。还有第二个错误,但这主要是第一个错误的结果代码>是一个语法错误。typedef名称必须是标识符float
是一个关键字。而且,除非OP愿意将语言从C语言转换为C++,否则模板不是有用的建议。谢谢你的回答。我想我可以编写一个简单的sed
脚本来替换所有出现的double
,sqrt()
,等等。工作。谢谢