1

是否可以创建一个非常精确的十进制值?

在我的计算机上,C++ 中的整数值是 32 位,along/double/long long是 64 位。我的信念是,如果这是错误的,请纠正我,浮点值在第一部分中具有 a1.xxxxx...乘以尾数。所以在那里你有一个小数,1之后的部分是一个十进制值。

因此,是否有可能或已经完成,简单地将 2 个整数“扑通”在一起并生成一个完全精确的十进制值?

然后,您将有一个最大值4294967295.42949672952147483647.4294967295一个有符号值(小数点不需要签名)。

以前有这样做过吗?如果是这样,为什么它与双打和花车相比不受欢迎?

4

1 回答 1

3

是与否

简短的回答是,您的提案的变体一直用于处理完全精确的十进制字符串。它不是任何流行计算机的本机格式,因此它是在软件中处理的,但考虑到如今的 CPU 速度,这几乎无关紧要。关键是将分数存储为以 10 为底的十进制字符串。

现在,您的提议似乎建议在第 32 位和第 33 位之间使用二进制小数点的定点数。这也已经完成,但它并没有解决十进制字符串分数不可表示的问题。

您会看到,问题在于十进制字符串分数是x / (2 n * 5 m )形式的有理数,并且大多数此类值无法以仅表示x / 2 n的二进制分数表示。

因此,例如,在.01.99之间,只有.25.50.75具有精确的二进制表示。IEEE 浮点和您的定点提案都是如此。

现在,如果不是二进制固定点,而是简单地将数字按 10 的幂进行缩放,那么所有数字都将是精确的。因此,如果您的比例为 10 6,则 $123.45 将存储为 123450000。

也就是说,你有两个选择。因为所有整数都具有二进制十进制的精确表示,所以您可以存储分数,并按照上述说明简单地缩放,或者您可以存储分数,但在内部使用十进制数字进行。比如说,为每个数字分配 4 位。这种格式称为 BCD。

所有这些技术已被无数次实施,因此您不必自己动手。例如,看看 Ruby 中的 BigDecimal。

如果我们要重做文明,选择一个是 2 的幂的数基可能会很方便。所有这些问题都直接源于我们编写小数值 IRL 的方式。我们使用十进制字符串,这几乎不可能精确地表示为二进制分数。

于 2013-02-13T01:07:57.663 回答