java中float和double有多少个有效数字



浮点是否有32位二进制数字,双精度是否有64位二进制数字?文件太难理解了。

所有的比特都能转换成有效数字吗?还是小数点的位置占用了一些位?

float32位(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位

长答案:

浮点数字有三个组成部分:

  1. 一个符号位,用于确定数字是正还是负
  2. 一个指数,用于确定数字的幅度
  3. 一个分数,它决定了数字的两个指数值之间的距离是。这有时被称为"尾数、尾数或系数">

从本质上讲,这适用于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进行编码,其中mbe的长度是固定的,因此直到某一点的浮点数确实具有大于1的差,即value + 1产生value。对于小于1的值也会发生同样的情况,即所有可能的代码点不具有相同的距离。

正因为如此,不存在像定点数字那样精确的n数字的精度,因为不是每个具有n十进制数字的数字都具有IEEE编码。

有一份几乎是强制性的文件,你应该阅读它来解释浮点数:每个计算机科学家都应该知道浮点运算。

看看Float.intBitsToFloatDouble.longBitsToDouble,它们在某种程度上解释了位与浮点数的对应关系。特别是,普通float的比特看起来有点像

s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW

其中A…W是23位——0和1——表示二进制中的分数——s是+/-1,分别用0或1表示,exp是有符号的8位整数。

相关内容

  • 没有找到相关文章

最新更新