【发布时间】: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。 (unsignedchar 断言可以写成CHAR_BIT==8。) -
目的是我使用浮点类型来执行整数运算以提高性能(不是专门替换整数类型,而是在某些情况下使用浮点类型),并且可以精确表示的整数的可用范围取决于关于可用的二进制位数。如果可能有多达 3 个前导零(以 16 为底),则考虑非常复杂,如果事物以 10 为底,则更是如此。
-
@juhist:找到两个浮点数(作为“高位”和“低位”)的精确和的一种技术是计算
high = x+y; err = high-x; low = y-err;,其中x是和数具有更大的绝对值。这会失败,特别是在基数 10 中——在两位数基数 10 浮点中,取x = y = 9.9,你会得到high = 20、err = 10和low = -0.10。 -
@KeithThompson OP 的版本确实具有不需要任何
#include的优点。这是非常规的,但我没有看到问题
标签: c floating-point c11