Floating point 理解浮点表示错误;什么';我的想法怎么了?

Floating point 理解浮点表示错误;什么';我的想法怎么了?,floating-point,floating-accuracy,Floating Point,Floating Accuracy,我很难理解为什么有些数字不能用浮点数来表示 正如我们所知,一个正常的浮点将有符号位、指数和尾数。例如,为什么不能在这个系统中准确地表示0.1;我的想法是,你把10(1010在箱子里)放在尾数上,把-2放在指数上。据我所知,这两个数字都可以用尾数和指数来精确表示。那么为什么我们不能精确地表示0.1呢?那将是10×2-1=5,而不是0.1 一般来说,这就像用十进制表示三分之一:用有限的数字是不可能的 顺便说一下,1010=10102≠ 11002.如果指数是十进制的(即代表10^X),则可以精确地表

我很难理解为什么有些数字不能用浮点数来表示

正如我们所知,一个正常的浮点将有符号位、指数和尾数。例如,为什么不能在这个系统中准确地表示0.1;我的想法是,你把10(1010在箱子里)放在尾数上,把-2放在指数上。据我所知,这两个数字都可以用尾数和指数来精确表示。那么为什么我们不能精确地表示0.1呢?

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

一般来说,这就像用十进制表示三分之一:用有限的数字是不可能的


顺便说一下,1010=10102≠ 11002.

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

有些语言的类型同时具有两个指数。例如,在C#中,有一种数据类型被恰当地命名为
decimal
,这是一种带有十进制指数的浮点格式,因此它将支持存储类似于0.1的数字,尽管它还有其他不常见的属性:
decimal
类型可以区分
0.1
0.10
,而且
x+1!=x
用于
x
的所有值


不过,出于最常见的目的,C#还有
浮点
浮点类型,它们不能精确存储0.1,因为它们使用二进制指数(如IEEE-754中定义的)。二进制浮点类型使用更少的存储空间,速度更快,因为它们更容易实现,并且定义了更多的操作。一般来说,
decimal
仅用于财务值,其中所有十进制值的精确表示非常重要,而存储、速度和操作范围则不重要。

您考虑的是1*10^-1,它适用于表示,例如C#中的十进制。普通浮点(如float、double)使用二进制表示,即2的幂

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

您必须开始读取

退房:


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

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