【问题标题】:Is FLT_RADIX ever not 2 in C11 for modern general purpose computers?现代通用计算机的 C11 中的 FLT_RADIX 不是 2 吗?
【发布时间】:2015-03-20 19:11:41
【问题描述】:

这几乎是我在标题中的问题。使用其他任何东西似乎完全不自然。

在对此进行研究时,我发现有硬件支持 base 10 的历史示例,以及更现代的 IBM POWER6 和 system z9 示例。即使在这些情况下,我也不知道FLT_RADIX 在任何主流 C 编译器上是否为 10。

我特别担心的是我正在为一个只能在通用计算机上运行的应用程序编写代码,我想知道我是否可以静态断言 FLT_RADIX==2 而不会引起严重关注,就像我目前的静态状态一样断言!(unsigned char)256

【问题讨论】:

  • 这个静态断言的目的是什么?您的程序是否依赖于 FLT_RADIX 为 2?如果是这样,你能解释一下你的程序的哪一部分依赖于它吗?我可以看到静态断言 chars 包含值 0-255(含)的值,但 FLT_RADIX 断言的值对我来说是个谜。
  • 我相信 IBM 已经在十进制浮点格式上做了一些工作,使用 10 位来表示 3 个十进制数字。它可能与二进制浮点并行存在。并且一些 IBM 大型机使用了浮点格式,其中指数是 16 的幂,而不是 2;我认为这意味着FLT_RADIX==16。 (unsigned char 断言可以写成CHAR_BIT==8。)
  • 目的是我使用浮点类型来执行整数运算以提高性能(不是专门替换整数类型,而是在某些情况下使用浮点类型),并且可以精确表示的整数的可用范围取决于关于可用的二进制位数。如果可能有多达 3 个前导零(以 16 为底),则考虑非常复杂,如果事物以 10 为底,则更是如此。
  • @juhist:找到两个浮点数(作为“高位”和“低位”)的精确和的一种技术是计算high = x+y; err = high-x; low = y-err;,其中x 是和数具有更大的绝对值。这会失败,特别是在基数 10 中——在两位数基数 10 浮点中,取 x = y = 9.9,你会得到 high = 20err = 10low = -0.10
  • @KeithThompson OP 的版本确实具有不需要任何 #include 的优点。这是非常规的,但我没有看到问题

标签: c floating-point c11


【解决方案1】:

附件 F 是 C 标准的“可选”部分,对于任何将使用浮点的严肃实现都是非可选的,它要求 floatdouble 的 IEEE 单精度和双精度(二进制 32 和二进制 64),分别,所以FLT_RADIX 应该总是2。在支持新的十进制浮点数的系统上,它是一个单独的扩展类型; FLT_RADIX==10 不用于它。

【讨论】:

  • 那么IEEE标准需要二进制?我想我错过了附件 F 中的内容,或者可能是参考了 IEEE 标准本身。谢谢。
  • 当前的 IEEE 标准定义了非二进制类型,但那些不是附件 F 中提到的那些。F.2 Types 内容如下: “float 类型匹配 IEC 60559 单格式。double 类型匹配 IEC 60559 双格式。”术语“单”和“双”来自标准的原始版本;这些格式已被重命名为“binary32”和“binary64”。
  • @Kyle Stewart “IEEE 标准”不需要二进制文件。请参阅上面的formats 和 R 评论。
  • @chux:IEEE 已经发布了很多标准。 C11 标准附件 F 中提到的一个是“微处理器系统的二进制浮点算法,第二版(IEC 60559:1989)”
  • @chux,你的权利,我应该更具体,根据我的阅读,85'标准没有指定不是二进制的格式,尽管它模糊地指定了两种可能不是二进制(扩展单和扩展双)。但是,这些扩展类型只能适用于 long double,附件 F 并没有多说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 2014-05-23
相关资源
最近更新 更多