浮点数是32位二进制数,双数位是64位二进制数?文档太难理解了。
所有位都转换为有效数字吗?或者小数点的位置是否占用了一些位?
答案 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
答案 1 :(得分:20)
答案很长:
浮点数有三个组成部分:
基本上,这适用于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)
浮点类型是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 ^ e
,m
和b
的长度是固定的。对于小于1的值也会发生相同的情况,即所有可能的代码点都没有相同的距离。
因此,与固定点数一样,没有精确e
个数字的精度,因为并非每个n
十进制数字的数字都具有IEEE编码。
有一个几乎是强制性的文件,你应该阅读它解释浮点数: What every computer scientist should know about floating point arithmetic
答案 5 :(得分:1)
查看Float.intBitsToFloat
和Double.longBitsToDouble
,这解释了位如何与浮点数对应。特别是,正常float
的位看起来像
s * 2^exp * 1.ABCDEFGHIJKLMNOPQRSTUVW
其中A ... W是23位 - 0和1 - 表示二进制的分数 - s是+/- 1,分别用0或1表示,exp是带符号的8位整数。