有多少有效数字在java中有浮点数和双精度数?

时间:2012-11-24 16:09:53

标签: java floating-point

浮点数是32位二进制数,双数位是64位二进制数?文档太难理解了。

所有位都转换为有效数字吗?或者小数点的位置是否占用了一些位?

6 个答案:

答案 0 :(得分:89)

float 32位(4字节)其中 23位用于尾数(约7位小数)。 8位用于指数,因此浮点数可以使用这8位将小数点“移动”到右侧或左侧。这样做可以避免在尾数中存储大量零,如0.0000003(3×10 -7 )或3000000(3×10 7 )。有1位用作符号位。

double 64位(8字节)其中 52位用于尾数(约16位十进制数字)。 11位用于指数,1位用于符号位。

由于我们使用的是二进制(只有0和1),当数字非零时,尾数中的一位隐式为1(float和double都使用此技巧)。

此外,由于所有内容都是二进制(尾数和指数),因此转换为十进制数通常不准确。像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

答案 1 :(得分:20)

32位浮点数具有大约7位精度,64位双精度具有大约16位精度

答案很长:

浮点数有三个组成部分:

  1. 一个符号位,用于确定该数字是正数还是负数。
  2. 指数,用于确定数字的幅度
  3. 一个分数,它确定两个指数值之间的距离 是。这有时称为“the significand, mantissa, or coefficient”
  4. 基本上,这适用于sign * 2^exponent * (1 + fraction)。尺寸” 数字,它的指数,与我们无关,因为它只是比例 分数部分的值。知道log₁₀(n)给出的数量 数字n,†我们可以确定浮点数的精度 与log₁₀(largest_possible_fraction)。因为浮点数中的每个位都存储2 可能性,二进制数n位可以存储最多2ⁿ - 1的数字(a 总计2ⁿ ,其中一个值为零)。这有点儿了 更发型,因为事实证明浮点数与一个存储 比它们可以使用的分数更少,因为零是特别表示的 并且所有非零数字都至少有一个非零二进制位。‡

    结合这个,浮点数的精度数字是 log₁₀(2ⁿ),其中n是浮点数的位数 分数。 32位浮点数的24位分数表示≈7.22十进制数 精度,64位双精度有53位分数,≈15.95十进制数 精确度。

    有关浮点精度的更多信息,您可能需要阅读有关浮点精度的概念 一个machine epsilon

    †至少n ≥ 1 - 对于其他数字,您的公式看起来更像   ⌊log₁₀(|n|)⌋ + 1

    ‡“这个规则被称为前导位约定,隐含位   约定,或隐藏位约定。“(Wikipedia

答案 2 :(得分:17)

来自java specification

  

浮点类型是float和double,它们在概念上是   与单精度32位和双精度相关联   64位格式IEEE 754值和IEEE中规定的操作   二进制浮点运算标准,ANSI / IEEE标准   754-1985(IEEE,纽约)。

由于在不理解IEEE754基础知识的情况下很难对数字做任何事情,这里是another link

重要的是要理解精度不均匀,并且这不是对整数的精确存储。

一个例子:

double a = 0.3 - 0.1;
System.out.println(a);          

打印

0.19999999999999998

如果您需要任意精确度(例如出于财务目的),您可能需要Big Decimal

答案 3 :(得分:7)

正常的数学答案。

了解浮点数是作为表示指数和其余部分的一些位实现的,大部分用于数字(在二进制系统中),其中一个具有以下情况:

如果最低有效位发生变化,则指数为10²³时,会出现两个相邻的distinghuishable数字之间的较大差异。此外,基数为2的小数点使得许多基数为10的数字只能近似; 1 / 5,1 / 10是无穷无尽的数字。

因此在 general 中:如果您关心有效数字,则不应使用浮点数。对于计算的货币金额,e,a,最好使用 BigDecimal

对于物理浮点双打就足够了,浮动几乎从不。此外,处理器的浮点部分FPU甚至可以在内部使用更多的精确度。

答案 4 :(得分:3)

浮点数使用指数形式进行编码,类似于m * b ^ e,即根本不像整数。你问的问题在fixed point numbers的背景下是有意义的。有许多fixed point arithmetic libraries可用。

关于浮点运算:小数位数取决于表示和数字系统。例如,有一些周期数(0.33333),它们没有十进制的有限表示,但有二进制数,反之亦然。

还值得一提的是,到某一点的浮点数确实有一个大于一的差异,即value + 1产生value,因为value + 1无法使用{编码{1}},其中m * b ^ emb的长度是固定的。对于小于1的值也会发生相同的情况,即所有可能的代码点都没有相同的距离。

因此,与固定点数一样,没有精确e个数字的精度,因为并非每个n十进制数字的数字都具有IEEE编码。

有一个几乎是强制性的文件,你应该阅读它解释浮点数: What every computer scientist should know about floating point arithmetic

答案 5 :(得分:1)

查看Float.intBitsToFloatDouble.longBitsToDouble,这解释了位如何与浮点数对应。特别是,正常float的位看起来像

 s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW

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