如何在使用GCC或/和IAR编译时禁用双精度数学

How to disable double-precision math while compiling with GCC or/and IAR?

本文关键字:编译 双精度 IAR GCC      更新时间:2023-10-16

我的嵌入式C代码运行在具有单精度FPUCortex 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

将浮点常量视为单精度,而不是隐式地将其转换为双精度常量。

作为一个快速的解决方案,请尝试遵循以下步骤:

  1. 在每个浮点常量后面加上后缀f: 1.3f, 3.1415f,以此类推。
  2. 只使用float变量。
    即使在编译器进行中高精度计算的情况下,
    最终结果将被截断到float的精度。
  3. 考虑float, doublelong double类型,
    他们都试图遵循由
    执行的规则。浮点标准ISO/IEC/IEEE 60559.
    C
    的浮点标准类型floatsingle floating-point
    类型double被指定为double floating-point
    类型long double,它打算为extended precistion floating-point
  4. 使(float)在计算的相关部分强制转换。
  5. 使用<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  

也许,为了微调浮点计算的行为,您必须深入了解特定编译器的选项。