c - 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
如果您要使用它,请自行承担风险:)
解决方案
不,这是基本语法,不能更改。
即使有可能,我也会不惜一切代价避免它,因为您的 C 项目将不再是实际的 C,而是一些在数字文字语义上有巨大差异的奇异方言;重用您项目中的代码、从另一个项目中导入代码或让其他人在您的项目上工作将是正确性风险。
FWIW,可以通过简单的正则表达式添加缺失的点,例如:
搜索:([^.]|^)\b([0-9]+)\b([^.]|$)
代替:$1$2.0$3
(在没有后视/前瞻的情况下完成,以获得最大的便携性)
推荐阅读
- bash - Shell 脚本排序
- javascript - 在多个元素上使用光滑滑块时出错
- python - 什么是从 Python 中仅部分字符串中删除重复项的简单方法?
- c# - PostgreSQL 中的 date_trunc 间隔 15 分钟
- python - 解析 json 列表时不理解这个 TypeError
- codeigniter - Codeigniter 通过自定义尺寸创建拇指图像,如何?
- postgresql - 使用 JOIN 时将空字符串替换为 NULL 而不是空字符串
- draw.io - 是否可以将 Lucidchart 图导出为 json,然后将其导入 draw.io?
- unit-testing - 运行strapi时如何跳过__mock__文件夹
- python - 充满数据框重组的字典