我很难理解为什么有些数字不能用浮点数来表示。
正如我们所知道的,正常的浮点数应该有符号位、指数和尾数。例如,为什么0.1不能在这个系统中准确地表示;我认为它的方式是你把10 (1010 in bin)放到尾数上,把-2放到指数上。据我所知,这两个数字都可以用尾数和指数准确地表示出来。那么为什么我们不能准确地表示0.1呢?
发布于 2011-06-08 15:12:16
如果您的指数是十进制(即表示10^X),则可以精确地表示0.1 --然而,大多数浮点格式使用二进制指数(即它们表示2^X)。因为没有像Y * (2 ^ X) = 0.1这样的整数X和Y,所以您不能在大多数浮点格式中精确地表示0.1。
有些语言的类型同时具有两个指数。例如,在C#中,有一种名为decimal的数据类型,这是一种带有十进制指数的浮点格式,因此它将支持存储像0.1这样的数字,尽管它有其他不常见的属性:decimal类型可以区分0.1和0.10,并且x + 1 != x对于x的所有值总是正确的。
然而,对于最常见的目的,C#也有float和double浮点类型,它们不能精确地存储0.1,因为它们使用二进制指数(如IEEE754中所定义)。二进制浮点类型使用的存储空间更少,速度更快,因为它们更容易实现,并且在其上定义了更多的操作。通常,decimal仅用于金融值,其中所有十进制值的精确表示很重要,而存储、速度和操作范围并不重要。
发布于 2011-06-08 15:17:18
您必须开始阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic
查看:
发布于 2011-06-08 15:13:27
您正在考虑1* 10^-1,它适用于decimal floating number表示,例如C#中的decimal。普通浮点数(如浮点数、双精度数)使用二进制表示法,即2的幂
通常,使用二进制是因为它们可以更有效地按位排列。Decimal通常在需要绝对小数精度时使用,例如在计算货币时。
https://stackoverflow.com/questions/6275327
复制相似问题