【问题标题】:How are the sizes of non IEEE754 floating-point types constrainted?非 IEEE 754 浮点类型的大小是如何限制的?
【发布时间】:2013-11-24 21:03:30
【问题描述】:

非 IEEE754 浮点类型 floatdoublelong double 的大小如何限制?

我知道每个浮点类型必须能够表示来自较小类型的所有值,这意味着sizeof(float) <= sizeof(double) <= sizeof(long double)

据我所知,float.h/cfloat 的最低要求是 sizeof(float)*CHAR_BIT>=32sizeof(double)*CHAR_BIT>=64sizeof(long double)*CHAR_BIT>=64

还有其他限制吗?如果是这样,它们是什么,是否意味着这些尺寸的最大值?

【问题讨论】:

  • 取决于您所谈论的任何浮点格式的定义。我知道的那些是因为就像 IEEE754 一样,每一个的大小都是固定的,因此你不能在其中放置比你可用的更多的位。
  • 问题是什么?
  • char 不需要为 8 位,因此它们的大小都可以为 1。在 64 位 DSP 上这实际上是合理的。
  • 我可以轻松地制作sizeof(float)>sizeof(double)——只是浪费float中的空间。
  • @HansPassant:啊,但是拥有一个标准的全部乐趣在于我们不必想象什么奇怪的实现会实际使用 IEEE-754。我们只是相信委员会允许这样做是个好主意(或者不同意委员会并编写不严格可移植的代码,ofc)。

标签: c++ c floating-point ieee-754


【解决方案1】:

认为问题是关于可表示值的约束。只有相当基本的约束在 C++ 中没有明确说明,但在 C 标准中的第 5.2.4.2.2 节(“浮点类型的特性<float.h>”)第 11 段(我只是引用我认为在这种情况下有趣的值):

以下列表中给出的值应替换为具有实现定义的值的常量表达式,这些值的大小(绝对值)大于或等于所示值,符号相同:

  • FLT_DECIMAL_DIG 6
  • DBL_DECIMAL_DIG 10
  • LDBL_DECIMAL_DIG 10
  • FLT_MIN_10_EXP -37
  • DBL_MIN_10_EXP -37
  • LDBL_MIN_10_EXP -37
  • FLT_MAX_10_EXP +37
  • DBL_MAX_10_EXP +37
  • LDBL_MAX_10_EXP +37
  • FLT_MAX 1E+37
  • DBL_MAX 1E+37
  • LDBL_MAX 1E+37
  • FLT_EPSILON 1E-5
  • DBL_EPSILON 1E-9
  • LDBL_EPSILON 1E-9

这几乎说明float 可能小于doubledoublelong double 可以是同一件事,并且与IEEE-754 的约束相比它们相距甚远。

【讨论】:

  • +1,这可能更接近所问的标记,是的。
【解决方案2】:

来自 N3337:

3.9.1.8
共有三种浮点类型:floatdoublelong doubledouble 类型提供的精度至少与float 一样高,long double 类型提供的精度至少与double 一样高。 float 类型的值集是double 类型的值集的子集; double 类型的值集是long double 类型的值集的子集。浮点类型的值表示是实现定义的。整数和浮点类型统称为算术类型。标准模板std::numeric_limits (18.3) 的特化应指定实现的每种算术类型的最大值和最小值。

C 标准在这里也很重要,所以它 (N1570) 对浮点类型的看法如下:

6.2.5.10
有三种真正的浮点类型,指定为floatdoublelong double.42) float 类型的值集是 输入doubledouble 类型的值集是 long double 类型的值集的子集。

42) 参见“未来语言方向”(6.11.1)。

6.11.1.1 浮动类型
未来的标准化可能包括额外的浮点类型,包括那些 比long double 更大的范围、精度或两者兼而有之。

据我所知,浮点几乎是所有实现定义的。有充分的理由,浮点是由 CPU 实现的。该标准无法保证各种浮点类型的大小。如果是这样,它可能会变得与较新的处理器完全不兼容。

float.h 和 cfloat 头文件使用它们在标准中的能力来定义实现。您提供的尺寸不是标准的一部分。

所以不,没有其他限制。*不,没有隐含的最大尺寸。

  • 这并不完全正确。 N1570 第 5.2.4.2.2 节中定义了许多其他信息,但没有以您要求的方式限制浮点值。

【讨论】:

  • 我给出的尺寸可能cfloat要求的最低要求的结果,例如FLT_DIG、FLT_MIN_10_EXP、FLT_MAX_10_EXP和FLT_EPSILON。
  • 如果是,那只是副作用,而不是实现要求。例如,浮点数上的 FLT_DIG 为 6,这要求浮点数可以处理高达 1e7 的值,这意味着浮点数能够处理至少 23.253...位的精度。
猜你喜欢
  • 2013-02-14
  • 1970-01-01
  • 2012-01-06
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 2013-07-24
相关资源
最近更新 更多