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

tsi*_*iki 5 floating-point floating-accuracy

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

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

Gab*_*abe 8

如果你的指数是十进制的(即它代表10 ^ X),你可以精确地表示0.1 - 但是,大多数浮点格式使用二进制指数(即它们代表2 ^ X).由于没有整数XY这样Y * (2 ^ X) = 0.1,你不能准确地代表最浮点格式0.1.

某些语言具有两种指数类型.例如,在C#中,有一个适当命名的数据类型decimal,它是一个带小数指数的浮点格式,所以它支持存储一个像0.1的数字,虽然它有其他不常见的属性:decimal类型可以区分0.10.10,它是x + 1 != x对于所有的价值观总是如此x.

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