了解浮点表示错误;我的想法有什么问题?

时间:2011-06-08 07:08:42

标签: floating-point floating-accuracy

我无法理解为什么有些数字不能用浮点数表示。

众所周知,普通浮点数会有符号位,指数和尾数。例如,为什么不能在这个系统中准确地表示0.1;我想到的方式是你将10(1010 in bin)放到尾数,-2放到exponent。据我所知,这两个数字都可以在尾数和指数中准确表示。那么为什么我们不能准确地代表0.1?

5 个答案:

答案 0 :(得分:8)

如果你的指数是十进制的(即它代表10 ^ X),你可以精确地表示0.1 - 但是,大多数浮点格式使用二进制指数(即它们代表2 ^ X)。由于XY没有整数Y * (2 ^ X) = 0.1,因此在大多数浮点格式中无法精确表示0.1。

某些语言的类型包含两个指数。例如,在C#中,有一个名为decimal的数据类型,它是一个带小数指数的浮点格式,所以它支持存储一个0.1之类的数字,尽管它有其他不常见的属性:{{1} }类型可以区分decimal0.10.10的所有值x + 1 != x始终为真。

但是,对于大多数常见目的,C#还具有xfloat浮点类型,它们无法精确存储0.1,因为它们使用二进制指数(如IEEE-754中所定义)。二进制浮点类型使用较少的存储,更快,因为它们更容易实现,并且在它们上定义了更多操作。通常,double仅用于财务值,其中所有十进制值的确切表示很重要,而操作的存储,速度和范围不是。

答案 1 :(得分:3)

答案 2 :(得分:2)

IEEE 754标准中的每个浮点数实际上是某个整数乘以2的整数次幂。例如,3由3 * 2 0 表示,96由3 * 2 3 表示,并且3/16由3 * 2 -4 <表示/ SUP>

没有整数x和y使得.1 = x * 2 y ,因此.1不能用浮点数精确表示。证明:如果.1 = x * 2 y ,那么10x = 2 -y 。 2 -y 显然是正的,所以x是正的。它也是一个整数,因此10x可以被10整除,所以它可以被5整除。因此2 -y 是2的幂,可以被5整除,这显然是不可能的。

答案 3 :(得分:1)

那将是10×2 -1 = 5,而不是0.1。

一般来说,它就像在十分之一中代表三分之一:只有有限数字的数字才有可能。

顺便说一句,10 10 = 1010 2 ≠1100 2

答案 4 :(得分:0)

您正在考虑1 * 10 ^ -1,它适用于decimal floating number表示,例如C#中的十进制。正常浮点(例如float,double)使用二进制表示,即以2

的幂表示

通常,使用二进制是因为它们可以更有效地按比特排列。当需要绝对小数精度时,通常使用十进制,例如在计算货币时。