首页 > 解决方案 > GCC 默认整数/浮点算术行为

问题描述

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

C 和 C++ 写入时的默认行为double a = 1/3;是返回 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 如果您要使用它,请自行承担风险:)

标签: cgccfloating-point

解决方案


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

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

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

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

代替:$1$2.0$3

(在没有后视/前瞻的情况下完成,以获得最大的便携性)


推荐阅读