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

问题描述 投票:0回答:3

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

来自 MISRA-C:2004,规则 6.3:
应使用表示大小和符号的

typedefs
来代替基本数字类型。

MISRA-C:2004,规则 6.3 引用 ISO (POSIX) 类型定义为:

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 电子工作台,版本 8.4

我们处于 MISRA-C:2004 阶段,因为他们投票不升级 MISRA,这需要创建验证测试协议并运行该协议。

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

详细问题如下:

  1. 固定宽度浮点类型的 typedef 是什么?
  2. 它们在什么包含文件中(或者它们是编译器默认定义的)?
floating-point language-lawyer c99 fixed-width
3个回答
4
投票

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

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

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

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


后退

代码可以使用下面和

_Static_assert
(自 C11 起)或 C99 替代品

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

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

进一步说明

兼容的 C 可能不具有所有 32、64、128 位 FP 类型,因此无法定义所有

float32_t, float64_t, float128_t

2 种不同的 Compliant C 实现可能具有 32 位 FP 类型,但编码不同。比较 float32CCSI,产生不同的范围、精度和次正常支持。

2 个不同的兼容 C 实现可能具有具有相同编码的 32 位 FP 类型,但不同的字节序,即使它们的整数字节序一致。

规则 6.3(建议):应使用指示大小和符号的 typedef 来代替基本数字类型。:该目标“有助于阐明存储的大小”,仅此而已。

规则 1.5(建议):浮点实现应符合定义的浮点标准。 特别难以实现。即使实现使用与 IEEE 754 相同的 FP 编码,C 也允许操作足够的实现定义的行为与 IEE 754 不同。 理想情况下,在 C 中,符合 IEEE 754 的实现定义 __STDC_IEC_559__

。然而,

证明

维持一致性具有足够的挑战性,以至于实现可能会放弃定义__STDC_IEC_559__,因为它可能只有 99.999% 的一致性。


1
投票

没有。

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


如果存在固定宽度浮点,它可能只能形成固定宽度。如果

不会

肯定会产生固定的范围、精度、编码等。

如果固定宽度浮点数也定义了编码,那么可移植性就会降低。如果愿意接受这一点,请考虑对常见 FP 编码特征进行一系列 #if

测试,并简单地使用

float, double, long double


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

0
投票

…例如,建议使用如下所示的 ISO (POSIX) typedef,并将其用于本文档中的所有基本数字和字符类型。对于 32 位整数机,这些如下:…

这是不好的措辞。这并不意味着 POSIX 或任何 ISO 标准提供了这些

typedef
声明。这意味着符合 MISRA 的软件,

,您正在编写的软件,本身应该定义这些 
typedef 名称并使用它们。
如果这不是该规则的预期含义,则该规则暗示这些类型是由 POSIX 指定的,这是错误的,因为 
float64_t

没有出现在 POSIX 2008 规范中。 (我没有检查早期版本;我假设如果它出现在早期版本中,至少会在 POSIX 2008 版本中提到它。)

© www.soinside.com 2019 - 2024. All rights reserved.