固定宽度浮动类型在哪里?

Where are the fixed width floating types?

什么是 C 标准固定宽度浮点类型,它们是在哪里定义的?

来自 MISRA-C:2004,规则 6.3:
typedefs 应使用指示大小和符号来代替基本数值类型。

MISRA-C:2004,规则 6.3 引用 ISO (POSIX) typedef 是:

typedef          char   char_t;
typedef signed   char   int8_t;
typedef signed   short  int16_t;  
typedef signed   int    int32_t;
typedef signed   long   int64_t;
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;
typedef unsigned long   uint64_t;
typedef          float  float32_t;
typedef          double float64_t;
typedef long     double float128_t;

我们公司使用的是 C-99。
IAR Electronic Workbench,版本 8.4

我们在 MISRA-C:2004,因为他们投票决定不升级 MISRA,这需要创建验证测试协议和 运行 协议。

平台为ARM Cortex M 运行 MicroCOS操作系统。

详细问题如下:

  1. 固定宽度浮点类型的 typedef 是什么?
  2. 它们在什么包含文件中(或者它们被编译器定义为默认文件)?

What are the C standard fixed width floating point types and where are they defined?

有none.


固定宽度的 FP 类型可能不足以实现 OP 的更高级别(未说明的)目标。

如果存在一个固定宽度的浮点数,它可能只会产生一个固定宽度。如果 not 肯定会产生固定的范围、精度、编码等

如果固定宽度的浮点也定义编码,可移植性会降低。如果愿意接受这一点,请考虑对常见的 FP 编码特征进行一系列 #if 测试,并简单地使用 float, double, long double.

C 标准固定宽度浮点类型未定义

  • C 浮点 (FP) 目标旨在包含变体和许多实现。

  • MISRA FP 目标是限制多样性。

固定大小的 FP 类型不会导致统一的位编码或其他一致的 FP 属性。它们在 C 中的用处有限 - 因此它们不是 C 标准或库的一部分。


Fall-back

代码可以在下面使用和 _Static_assert(自 C11 起)或 C99 substitute

typedef      float  float32_t;
typedef      double float64_t;
typedef long double float128_t;

_Static_assert(sizeof(float)*CHAR_BIT == 32, "float 32");
_Static_assert(sizeof(float)*CHAR_BIT == 64, "float 64");
_Static_assert(sizeof(float)*CHAR_BIT == 128, "float 128");

补充说明

兼容的 C 可能没有所有 32、64、128 位 FP 类型,因此无法定义所有 float32_t, float64_t, float128_t.

2 种不同的 Compliant C 实现可能具有 32 位 FP 类型,但编码不同。比较 float32 vs. CCSI 导致不同的范围、精度和 sub-normal 支持。

2 种不同的 Compliant C 实现可能具有 32 位 FP 类型,具有 相同的 编码,但不同的端序,即使它们的整数端序一致。

Rule 6.3 (advisory): typedefs that indicate size and signedness should be used in place of the basic numerical types.:该目标“有助于明确存储的大小”,仅此而已。

Rule 1.5 (advisory): Floating-point implementations should comply with a defined floating-point standard. is particularly difficult to achieve. Even if an implementation uses the same FP encoding as IEEE 754,C 允许操作足够的实现定义的行为与 IEE 754 不同。

理想情况下,在 C 中,符合 IEEE 754 的实现定义 __STDC_IEC_559__。然而 证明 维护 一致性具有足够的挑战性,以至于实施可能会放弃定义 __STDC_IEC_559__ 因为它可能只有 99.999% 符合。

显然(非官方来源),MISRA-C:2004 规则 6.3 说:

… For example, the ISO (POSIX) typedefs as shown below are recommended and are used for all basic numerical and character types in this document. For a 32-bit integer machine, these are as follows:…

这是错误的措辞。这并不意味着 POSIX 或任何 ISO 标准提供这些 typedef 声明。这意味着符合 MISRA 的软件,,您正在编写的软件本身应该定义这些 typedef 名称并使用它们。

如果这不是规则的预期含义,那么规则暗示这些类型由 POSIX 指定是错误的,因为 float64_t 没有出现在 POSIX 中2008 规范。 (我没有检查早期版本;我假设如果它出现在早期版本中,至少会在 POSIX 2008 版本中提及它。)