浮点是否有32位二进制数字,双精度是否有64位二进制数字?文件太难理解了。
所有的比特都能转换成有效数字吗?还是小数点的位置占用了一些位?
float:32位(4字节),其中23位用于尾数(约7位小数)。8位用于指数,因此浮点运算可以使用这8位将小数点向右或向左"移动"。这样做可以避免在尾数中存储大量零,如0.0000003(3×10-7)或3000000(3×。有1位用作符号位。
双:64位(8字节),其中 52位由于我们使用二进制(只有0和1),当数字为非零时,尾数中的一位隐含地为1(浮点和双精度都使用此技巧)。 此外,由于所有数据都是二进制的(尾数和指数),因此转换为十进制数字通常并不精确。像0.5、0.25、0.75、0.125这样的数字是精确存储的,但0.1不是。正如其他人所说,如果您需要精确存储美分,请不要使用float或double,而是使用int、long、BigInteger或BigDecimal。 来源: http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers http://en.wikipedia.org/wiki/Binary64 http://en.wikipedia.org/wiki/Binary32
32位浮点的精度约为7位,64位双精度约为16位
长答案:
浮点数字有三个组成部分:
- 一个符号位,用于确定数字是正还是负
- 一个指数,用于确定数字的幅度
- 一个分数,它决定了数字的两个指数值之间的距离是。这有时被称为"尾数、尾数或系数">
从本质上讲,这适用于sign * 2^exponent * (1 + fraction)
。"大小"这个数字的指数与我们无关,因为它只缩放分数部分的值。知道log₁₀(n)
给出了n
,†的数字,我们可以确定浮点数的精度用CCD_ 4。因为浮点中的每个位存储2可能的情况下,n
比特的二进制数可以存储高达2ⁿ - 1
(a2ⁿ
值的总和,其中一个值为零)。这有点更麻烦的是,因为事实证明浮点数是用一来存储的比他们可以使用的分数少,因为零是专门表示的并且所有非零数字都至少有一个非零二进制位
结合起来,浮点数的精度位数为log₁₀(2ⁿ)
,其中n
是浮点数的位数小部分32位浮点有24位小数,其小数位数约为7.22精度,64位双精度具有53位小数,小数位数≈15.95精度。
有关浮点精度的更多信息,您可能想了解机器ε。
†至少对于n ≥ 1
——对于其他数字,您的公式看起来更像CCD_ 11。
⏹"该规则被称为前导位约定,即隐式位约定或隐藏位约定。"(维基百科)
来自java规范:
浮点类型是float和double,它们在概念上是与单精度32位和双精度相关IEEE中规定的64位格式IEEE 754值和操作二进制浮点运算标准,ANSI/IEEE标准754-1985(IEEE,纽约)。
如果不了解IEEE754的基本知识,很难对数字做任何事情,这里有另一个链接。
重要的是要理解精度是不一致的,这不是像整数那样精确存储数字。
一个例子:
double a = 0.3 - 0.1;
System.out.println(a);
打印
0.19999999999999998
如果您需要任意精度(例如出于财务目的),则可能需要大小数。
一个普通的数学答案。
理解浮点数被实现为表示指数的一些位和其余的位,大多数是数字(在二进制系统中),有以下情况:
对于高指数,例如10²³,如果最低有效位发生变化,则两个相邻的可分辨数字之间会出现较大差异。此外,基数为2的小数点使得许多基数为10的数字只能近似;1/5、1/10是无穷无尽的数字。
因此,在通用中:如果您关心有效数字,则不应使用浮点数。对于带有计算的货币金额,e,a,最好使用BigDecimal。
对于物理浮点双就足够了,浮点几乎永远不会。此外,处理器的浮点部分FPU甚至可以在内部使用更高的精度。
浮点数字使用指数形式编码,类似于m * b ^ e
,即根本不像整数。你所问的问题在不动点的情况下是有意义的。有许多固定点算术库可用。
关于浮点运算:小数位数取决于表示形式和数字系统。例如,有些数字(例如:1/5)以十进制表示,但不以二进制表示;每个有限的二进制分数在十进制中也是有限的(因为二进制的基数是2,而十进制的基数是2*5)。
此外,值得一提的是,由于value + 1
不能使用m * b ^ e
进行编码,其中m
、b
和e
的长度是固定的,因此直到某一点的浮点数确实具有大于1的差,即value + 1
产生value
。对于小于1的值也会发生同样的情况,即所有可能的代码点不具有相同的距离。
正因为如此,不存在像定点数字那样精确的n
数字的精度,因为不是每个具有n
十进制数字的数字都具有IEEE编码。
有一份几乎是强制性的文件,你应该阅读它来解释浮点数:每个计算机科学家都应该知道浮点运算。
看看Float.intBitsToFloat
和Double.longBitsToDouble
,它们在某种程度上解释了位与浮点数的对应关系。特别是,普通float
的比特看起来有点像
s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW
其中A…W是23位——0和1——表示二进制中的分数——s是+/-1,分别用0或1表示,exp是有符号的8位整数。