【发布时间】:2018-12-10 14:33:11
【问题描述】:
我有一组非常长的方程式,我最初针对 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
如果您要使用它,请自行承担风险:)
【问题讨论】:
-
在
pow(d,4)中,4将通过函数调用转换为double,但在诸如1/3之类的表达式中,您需要更改其中至少一个的类型double的操作数。例如:1./3、1/3.、(double)1/3或1/(double)3都将计算为 0.333333.... -
哪个 ARM?如果它是较小的 Cortex M 之一,那么您可以告诉 MATLAP 迷路,因为它们没有 FPU。
-
@Lundin,它是 Cortex A-8,采用 Beaglebone Black。
-
您可以添加 F 或 D 而不是 .0 并追踪所有常量,而不仅仅是没有任何小数点的常量...如果/当您必须这样做时(很确定您必须下面指出)。
-
@user2162550 M0 到 M3 没有 FPU。在 M4 上是可选的。
标签: c gcc floating-point