二进制浮点数的十进制精度

时间:2014-06-24 01:33:47

标签: floating-point floating-point-precision numerical

我在很多面试考试中都发现了这个问题,但是我自己也没有看到如何找到合适的解决方案。问题是:

  

由两个16位字表示的浮点数可表示多少位精度?

解决方案显然大约是6位数。

这是从哪里来的,你将如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

非常简单:32位IEEE-754浮点数对于尾数有23 + 1位(AKA有效数,在IEEE中说)。尾数的大小或多或少决定了可表示数字的数量。

要获得有效位数,只需计算 log 10 (2 24 ,即约。 7.22 。 (或者,如果你认为只有23位计数,因为最后一位是固定的,你得到 log 10 (2 23 ,大约 6.92 )。因此,实际上,对于标准化值,您有大约6-7个有效数字。

对于64位浮点值(双精度)也可以这样做。它们有52(或53)位来存储尾数,因此计算 log 10 (2 52 ,即约。 15.6 (或53位的 15.9 ),它为您提供了大约15位有效数字。

答案 1 :(得分:3)

IEEE-754浮点数具有符号位,指数的一些位数(e),以及尾数的一些数字(m),即指数乘以2的数字。结果数字的格式为

  

±m×2 e   
例如,0b1.01×2 -0b0100 = 1.25×2 -4 = .078125

直接类似于(十进制)科学记数法中的实数,

  

±m×10 e   
例如 7.8125×10 -2

正如十进制中的有效位数与指数部分无关,二进制浮点也是如此,精度完全由尾数中的位数设置。尾数越长,数字的精确度就越高。对于32位浮点数,IEEE-754 standard将尾数中的位数设置为23位(+1加号+8表示指数);对于64位浮点数,它是52位(+ 1,+ 11)。

科学记数法有另一种惯例;尾数必须在1(10 0 )和10(10 1 )之间。通过使科学记数法中的表示形式独特,大大简化了比较 - 只有一种方法可以用科学记数法编写数字。即,200表示为2×10 2 ,而不是20×10 1 或0.2×10 3 。因此,人们可以非常快速地比较数字 - 任何数量的形式+ xyz×10 2 必然小于+ abc×10 3 形式之一。

类似地,在二进制中,尾数必须在1和2之间(2 0 ... 2 1 )。因此,尾数的第一位必须是1;因为知道它的值必须是什么,所以不需要明确存储它,因此你实际上有24位和53位的尾数。 (对于非常小的数字 - denormalized numbers - 该位隐式为0,而不是1,但结果相同)。

因此,32位浮点数中的24位尾数可以从

开始
0b1.00000000000000000000001 ~ 1.00000012
     to
0b1.11111111111111111111111 ~ 1.99999988

也就是说,你可以得到或者低于1的最小增量是小数点后7位。另一种看待它的方法是考虑中间附近的数字并查看间距是什么:

0b1.01111111111111111111110 ~ 1.49999976
0b1.01111111111111111111111 ~ 1.49999988
0b1.10000000000000000000000 ~ 1.5
0b1.10000000000000000000001 ~ 1.50000012

所以你在小数点后七位得到大约1.2的间距 - 所以你得到的东西少于七个但超过六位数的精度。这个间距在数字的范围内有所不同;另外,一个很少只做一个浮点运算,并且由于舍入而导致的这些错误传播,因此人们通常会谈到6位数的精度。还应该注意的是,虽然精度仅取决于尾数的大小,但“转换”为十进制数字错误的方式在某种程度上也取决于指数;你可以通过取一些这些值并乘以2的幂来看到它。但六位精度是一个很好的经验法则。

wikipedia page很好地概述了浮点数,而综合参考是Goldberg的What Every Computer Scientist Should Know About Floating-Point Arithmetic