如何在使用GCC或/和IAR编译时禁用双精度数学
How to disable double-precision math while compiling with GCC or/and IAR?
我的嵌入式C代码运行在具有单精度FPU
的Cortex M4F
上。我关心的是编译器在
float_var1 = 3.0 * int_var / float_var_2;
(3.0 instead of 3.0f)
* * 恐怕我会漏掉一些双常量。如何找到所有出现的较慢的双精度数学?禁用双精度或使用源代码GCC或IAR生成错误/警告都可以做到。
请指导我正确的方法来实现我的目标。
我如何找到所有出现较慢的双精度数学?禁用双精度或使用其中之一生成错误/警告源代码GCC或IAR会做。
-Wdouble-promotion
完全是你想要的,见文档,在警告选项下。顺便说一下,文档中的示例与您的示例非常相似。
这是你的基本例子:
float f(int int_var, float float_var_2) {
return 3.0 * int_var / float_var_2;
}
以下是当我将-Wdouble-promotion
标志传递给gcc时发生的情况:
function ' f ':
float.c:2:24:警告:从' float '到' double '的隐式转换以匹配二进制表达式的其他操作数[-Wdouble-promotion]
如果您也传递-Werror
标志,则可以将所有警告转换为错误。如果过于严格,您可以通过传递-Werror=foo
有选择地将警告转换为错误,请参阅警告选项
gcc有一个优化选项-fsingle-precision-constant
,它将普通浮点常量视为单精度:
-fsingle-precision-constant
将浮点常量视为单精度,而不是隐式地将其转换为双精度常量。
作为一个快速的解决方案,请尝试遵循以下步骤:
- 在每个浮点常量后面加上后缀f: 1.3f, 3.1415f,以此类推。
- 只使用
float
变量。
即使在编译器进行中高精度计算的情况下,
最终结果将被截断到float
的精度。 - 考虑
float
,double
和long double
类型,
他们都试图遵循由
执行的规则。浮点标准ISO/IEC/IEEE 60559.
C
的浮点标准类型float
为single floating-point
,
类型double
被指定为double floating-point
,
类型long double
,它打算为extended precistion floating-point
。 - 使
(float)
在计算的相关部分强制转换。 - 使用
<math.h>
带后缀"f"的函数,
它们旨在接受并返回float
类型的值。
然而,所有早期的食谱都只是推荐。
有时编译器会在long double
的精度中进行中间计算。
这些信息可以从<float.h>
头中存在的宏中检索。
例如:
FLT_EVAL_METHOD // gives information about the method used in intermediate evaluations
FLT_ROUNDS // gives information about the rounding method
也许,为了微调浮点计算的行为,您必须深入了解特定编译器的选项。
相关文章:
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 在C++中序列化浮点数/双精度,编译为 WebAssembly
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 编译C++代码以.EXE返回双精度
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- 使用 gcc 编译时,PowerPC 上的长双精度错误
- 使用整数模板参数创建编译时双精度
- 如何在使用GCC或/和IAR编译时禁用双精度数学
- 在VS2010中编译带有长双精度的Windows c++应用程序
- 在编译时在浮点数和双精度之间切换