GCC默认整数/浮点算术行为

时间:2018-12-10 14:33:12

标签: c gcc floating-point

我最初针对MATLAB编写了一组非常长的方程式。现在,我必须将其移植到控制器的嵌入式C中。

当写入double a = 1/3;时,

C和C ++的默认行为是返回0,因为它被解析为整数算术。我想知道是否有一种方法可以关闭此行为,这样就不必在方程式的每个常数上附加.0。

例如,以下内容相对简短:

eq = (121.0/16.0*pow(d,4)*pow(r,2)*pow(x,10)+2*pow(r,2)*pow(11.0/6.0,3)*pow(d,4)*pow(x,10) + pow(r,2)*pow(11.0/6.0,6)*pow(d,6)*pow(x,18) + pow(r,2)*pow(d,2)*pow(x,2) - pow(jmax,2));

我的目标是一台ARM计算机,所以我正在使用Linaro GCC。

编辑:

事实证明,改变GCC行为是一个巨大的禁忌。 感谢@Matteo Italia,使用正则表达式解决了此问题。 最后编写了一个基于Qt的小型解决方案,用于将^替换为幂符号,并将尾随.0添加到文字数字上,可在此处找到: https://github.com/pauloasherring/MATEquationToC 如果要使用它,后果自负:)

2 个答案:

答案 0 :(得分:8)

不。这是基本语法,不能更改。

即使有可能,我也会不惜一切代价避免使用它,因为您的C项目将不再是实际的C语言,而是一些数字文字语义上具有巨大差异的奇异方言;重复使用项目中的代码,从另一个项目中导入代码或让其他人在您的项目上工作都将带来正确性。

FWIW,可以通过简单的正则表达式添加缺少的点,例如:

搜索:([^.]|^)\b([0-9]+)\b([^.]|$)

替换:$1$2.0$3

(不带回头/超前的处理,以实现最大的便携性)

答案 1 :(得分:1)

尝试使用种姓:双a =(双)1/3 ..