我的嵌入式 C 代码运行在单精度 Cortex M4F
上,它有一个单精度 FPU
。我关心编译器在像 这样的地方 经常放置基于软件的双精度数学操作。
float_var1 = 3.0 * int_var / float_var_2;
(3.0 instead of 3.0f)
我担心会错过一些双精度常量。如何定位所有较慢的双精度数学运算?使用sourcery GCC或IAR禁用双精度或生成错误/警告即可。
请指导我实现我的目标的正确方法。
我该如何查找所有较慢的双精度数学运算?在sourcery GCC或IAR中禁用双精度或生成错误/警告会做到这一点。
-Wdouble-promotion
正好可以满足你的要求,请参阅文档中的警告选项。顺便说一下,文档中的示例与你的情况非常相似。
以下基本上是你的示例:
float f(int int_var, float float_var_2) {
return 3.0 * int_var / float_var_2;
}
如果我在gcc中传递-Wdouble-promotion
标志,会发生什么:
gcc -c -Wdouble-promotion float.c
float.c: In function ‘f’:
float.c:2:24: warning: implicit conversion from ‘float’ to ‘double’ to match other operand of binary expression [-Wdouble-promotion]
如果您还传递-Werror
标志,则可以将所有警告转换为错误。如果这太严格了,您可以通过传递-Werror=foo
选择性地将警告转换为错误,请参见文档中的警告选项
gcc有一个优化选项-fsingle-precision-constant
,将普通浮点常量视为单精度浮点数:
-fsingle-precision-constant
将浮点常量视为单精度浮点数,而不是隐式转换为双精度浮点常量。
作为快速解决方案,请尝试按照以下步骤进行:
float
变量。float
的精度。float
、double
和 long double
都试图遵循浮点标准 ISO/IEC/IEEE 60559 中所执行的规则。float
旨在成为 单精度浮点数
,double
旨在成为 双精度浮点数
,long double
旨在成为 扩展精度浮点数
。(float)
强制转换。<math.h>
函数,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