【问题标题】:Are there fixed-width float types in clang?clang 中是否有固定宽度的浮点类型?
【发布时间】:2018-12-28 14:02:48
【问题描述】:

GCC 为固定宽度的浮点数提供 _Float32 和 _Float64。

但是,这些不是标准的,并且在 clang 中不存在。我也找不到 clang 的等价物。

某些平台可以将浮点或双精度定义为不是 32 位或 64 位,因此不能选择使用这些类型。

【问题讨论】:

  • 您想要解决的真正问题是什么?为什么要使用非标准类型?除非您实际上明确地针对浮点类型具有异常大小的平台,否则为这样的平台构建代码的可能性微乎其微。
  • @Someprogrammerdude:固定格式类型确实有明显的好处,所以我们不需要 OP 来回答这些问题来解决这个问题。拥有固定格式的类型使我们能够减少平台之间程序的差异。工程原理从规范中得出断言的结果,这意味着我们说程序以某种方式运行因为它使用的事物的文档为我们提供了某些保证。依赖某事发生的“机会”不是工程。
  • 另一方面,类型的宽度仅仅是一个足够的规范,还是应该是例如 IEEE-754 32 位浮点数?是否有一个提供 IEEE-754 32 位浮点数的平台,但它不是 float,并且仍然可以使用(该类型的软件仿真可能不是)?在我看来,如果类型的确切规格很重要,则应在预编译步骤中确定合适的类型。 (话虽如此,我不知道 GCC 的 _Float32 是否被定义得更具体,而不仅仅是 32 位大小。)
  • @EricPostpischil,确实可以从显式宽度类型中获得真正的好处,但这并不能消除 Some 的问题,因为我们不知道 OP 实际上是否正在寻找其中的任何一个特别的好处。由于确实没有任何标准的显式宽度浮点类型,因此了解 OP 试图实现什么以提出适当的替代方案很有用。
  • 而另一种可能是该程序依赖于 doublefloat 分别以 IEEE 754 二进制 64 位和 32 位浮点格式表示,并且文档作为对其运行的实现的要求。

标签: c clang


【解决方案1】:

回答提出的问题,CLang's documented language extensions 不包括 GCC 的 _Float32_Float64 类型的类似物。但是请注意,甚至 GCC 也仅在原生支持相应类型的目标上提供这些。

另一方面,由于 clang 是建立在 LLVM 之上的,因此值得考虑 LLVM's documentation of FP type representations

half、float、double、fp128的二进制格式分别对应 binary16、binary32、binary64 和 分别为二进制128。

在这个意义上,CLang 的_Float64_Float32 等价物分别是doublefloat。 (事实上​​,对于支持显式宽度版本的几乎所有目标,在 GCC 中都具有相同的等价性。)

【讨论】:

  • 这是否意味着双精度和浮点数对于 clang 总是 64 位和 32 位?
  • @Revolver:是的,对于任何符合附件 F 的 C 实现,即所有有趣的实现。
  • @R.. 这个评论 + 这个答案是帮助我找到解决方案的原因。附件 F 确实指定了 float 和 double 类型的宽度。
【解决方案2】:

是的。它们被称为floatdouble

【讨论】:

  • 据我所知,C 标准并没有规定浮点 必须 为 32 位,只是它至少为 32 位。就我而言,它必须是 32 位。
  • @GUIpsp,标准甚至没有规定float必须至少为32位,除非实现定义了宏@987654324 @,从而宣布支持 IEC 60559,即 IEEE 754 2008。但是请注意,从历史上看,实现失败或拒绝定义该宏的情况相当普遍,但仍为 @ 提供(至少)IEC 60559 表示987654325@ 和double。这可能是明智的,因为附件 F 也包含行为规范,而且这些规范不像数据格式那样始终如一地遵循。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多