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

标签 c gcc floating-point

我有一组非常长的方程,是我最初针对 MATLAB 编写的。现在,我必须将其移植到我的 Controller 的嵌入式 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 如果您要使用它,请自行承担风险:)

最佳答案

没有。这是基本语法,无法更改。

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

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

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

替换:$1$2.0$3

(没有lookbehind/lookahead来实现最大的可移植性)

关于c - GCC 默认整数/浮点算术行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53707813/

相关文章:

c - 符号大小用来表示负数吗?

c++ - std::unordered_map 之间的reinterpret_cast

c - 如何将 %d 作为十进制整数与 %f 在同一行中使用?

c - 使用正则表达式以 UTF8 读写 C 中的文本文件

c - 在gtk中添加垂直滚动条并捕获其事件

c++ - [性能]--- string::operator+= vs. vector<char> push_back

C 中的编译器错误 - ELSE 语句后的 ‘;’ 标记之前应有 ‘{’

c - 如何在 C 中将浮点值限制为小数点后两位?

c++ - 在浮点精度成为问题之前可以将多少个 float 加在一起

c - 具有明显完美代码的 C 程序中的段错误