固定宽度浮动类型在哪里?
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操作系统。
详细问题如下:
- 固定宽度浮点类型的 typedef 是什么?
- 它们在什么包含文件中(或者它们被编译器定义为默认文件)?
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 版本中提及它。)
什么是 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操作系统。
详细问题如下:
- 固定宽度浮点类型的 typedef 是什么?
- 它们在什么包含文件中(或者它们被编译器定义为默认文件)?
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 版本中提及它。)