我在很多面试考试中都发现了这个问题,但是我自己也没有看到如何找到合适的解决方案。问题是:
由两个16位字表示的浮点数可表示多少位精度?
解决方案显然大约是6位数。
这是从哪里来的,你将如何解决这个问题?
答案 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。