Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gcc 用float而不是double编译c代码_Gcc_Floating Point - Fatal编程技术网

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

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 或者使用模

我有一个用C写的冗长的数值积分方案。我想用浮点精度测试我的算法。有没有办法告诉gcc将整个程序中每次出现的
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()
,等等。工作。谢谢