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

时间:2013-02-13 01:02:28

标签: floating-point floating-accuracy floating-point-precision

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

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

因此,只要将2个整数“plop”在一起并制作一个完全精确的十进制值,它是可能还是已经完成?

对于签名值,您的最​​大值为4294967295.42949672952147483647.4294967295(不需要对小数进行签名)。

之前是否完成过?如果是这样的话,为什么它与双打和花车相比不受欢迎?

1 个答案:

答案 0 :(得分: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。

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

所有这些技术都已经无数次实施,所以你不必自己动手。例如,看看Ruby中的BigDecimal。

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