固定点数与浮点数

159

我无法理解定点数和浮点数,因为Google上的定义难以理解。但是我读过的所有定义都没有提供足够简单的解释它们的真实含义。请给我一个简单的定义并附带示例。

我无法理解定点数和浮点数,因为Google上的定义难以理解。但是我读过的所有定义都没有提供足够简单的解释它们的真实含义。请给我一个简单的定义并附带示例?

我也很难找到一个好的定义。我主要想要的是帮助我理解这些结果的东西:3.11 + 42.0 = 45.110001(不是45.11),3.12 + 42.0 = 45.119999(不是45.12),3.15 + 42.0 = 45.150002(不是45.15)。 - Bart S.
1
我认为这是一个相关的讨论(特别是描述浮点数陷阱和固定点更好的精度,以及为什么您永远不想将货币描述为浮点数)。https://dev59.com/OG015IYBdhLWcg3w6QHA - Andrew Norman
OpenGL ES 包括针对浮点和定点系统的配置文件,以及 EGL™ 规范... [随机链接中提到相关主题] (https://www.khronos.org/opengles/) - Nate Anderson
为什么您还没有接受一个答案?有什么是您需要的但是缺失的吗?您想设置悬赏以填补您所需的缺失知识吗? - Charlie Parker
7个回答

209
一个固定点数有特定的位数(或数字)用于整数部分(小数点左侧的部分),以及特定的位数用于小数部分(小数点右侧的部分)。无论您的数字是多大还是多小,它都将始终为每个部分使用相同数量的位。例如,如果您的固定点格式是十进制的IIIII.FFFFF,那么你能表示的最大值是99999.99999,最小非零值是00000.00001。处理这些数字的每一行代码都必须内置知道小数点在哪里。
浮点数不保留特定的位数用于整数部分或小数部分。相反,它为数字(称为尾数有效数字)保留了一定数量的位数,并且为该数字中小数点所在位置保留了一定数量的位数(称为指数)。因此,占据10个数字并为指数保留2个数字的浮点数可能表示最大值为9.9999999e+50,最小非零值为0.0000001e-49

10
你忘了浮点数几乎总是带符号的,所以最小值实际上应该是“-9.9999999e+50”。 - Rag
4
还有指数偏置的存在,这使得你可以在0到1之间表示远远多于在100万和1000001之间所能表示的离散值。此外,浮点数运算中还有很多复杂问题需要处理,例如确保当偏置不足以增加精度时,不会将0报告为两个非常相似数字之间的差异。 - Rag
43
@BrianGordon:我没有忘记符号位;我故意忽略它们,以便拥有一个简单的描述,并且不必担心最小/最大值和最小/最大值之间的差异。我还故意省略了指数偏置(与任何两个数字之间的离散值无关),NaN、无穷大、归一化、渐进下溢、有符号零、大多数浮点数是二进制(允许省略尾数的第一位),以及其他一些不必要的方面来说明这个概念。 - Gabe
4
@NickMiller:抱歉让你感到困惑,我是在谈论非零数。我的示例格式可以表示0、0.00001、0.00002、...、99999.99998和99999.99999。 - Gabe
5
关键在于答案中提到了10个数字(digit),而不是许多熟悉计算机算术的人可能期望的10个比特(bits)。在讨论二进制表示后,答案转而举了全部为十进制的例子。因此,9.9999999+e50含有1个数字9,7个数字9,和2个数字5,总共为(1+7+2=)10个数字。 - lindes
显示剩余6条评论

48
一个固定点数只是指小数点后有固定数量的数字。浮点数允许小数点后的数字数量变化。
例如,如果你有一种存储数字的方式要求小数点后恰好有四个数字,则它是固定点。如果没有这种限制,则为浮点数。
通常情况下,在使用固定点时,程序员实际上使用整数,并假定一些数字在小数点之后。例如,我可能想保留两位精度,因此一个值为100实际上意味着1.00,101意味着1.01,12345意味着123.45等。
浮点数更具一般性,因为它们可以以相同的方式表示非常小或非常大的数字,但需要额外的存储以确定小数点位置,这是一个小小的劣势。

2
当你开始使用浮点数进行计算时,例如将一个非常小的浮点数和一个非常大的浮点数相加,浮点数的使用就会成为一个问题。由于它必须表示两个极端的数字,因此所得到的结果会失去精度,并且较低的小数位会被截断(而不是四舍五入)。 - Andrew Norman
2
同时,在浮点数中使用指数值也可能会导致计算机系统出现问题,因为它们期望标准数字。 - Andrew Norman

10
据我所知,定点算术使用整数完成,其中小数部分存储在固定数量的位中,或者将数字乘以所需小数精度的位数。
例如,如果需要存储数字12.34并且我们只需要小数点后两位的精度,则将该数字乘以100得到1234。在对此数字执行数学运算时,我们将使用以下规则集。将5620或56.20添加到此数字将产生数据中的6854或68.54。
如果我们想计算定点数的小数部分,我们使用模(%)操作符。
12.34(伪代码):
v1 = 1234 / 100 // get the whole number
v2 = 1234 % 100 // get the decimal number (100ths of a whole).
print v1 + "." + v2 // "12.34"

在编程中,浮点数是完全不同的故事。当前的浮点数标准使用大约23位用于数字的数据,8位用于指数,1位用于符号。欲了解更多信息,请参考维基百科链接。


4
术语“固定点”是指数字的表示方式,有一定数量的小数位以及有时在小数点前面。 采用浮点表示法时,小数点的位置可以相对于数字的有效数字“漂移”。 例如,具有统一小数点放置约定的固定点表示法可以表示数字123.45、1234.56、12345.67等,而浮点表示法还可以表示1.234567、123456.7、0.00001234567、1234567000000000等。

2

关于我认为固定点数的定义特征,很少有提及。关键区别在于浮点数由于四舍五入或截断而产生的误差是恒定的相对(百分比)误差。而固定点数则具有恒定的绝对误差。

使用64位浮点数,你可以确保x+y的答案不会超过1个比特位,但一个比特位有多大呢?这取决于xy -- 如果指数等于10,那么舍入最后一位表示误差为2^10=1024,但如果指数为0,则舍入一位的误差为2^0=1

使用定点数,一个比特始终代表相同的数量。例如,如果小数点前有32位,小数点后有32位,那么截断误差最多会改变答案2^-32。如果你处理的数字都接近于1,这非常好,因为可以获得很高的精度,但如果你处理的数字具有不同的单位,那么计算出一个谷歌米的距离,然后得到2^-32米的误差又有什么意义呢?

一般来说,浮点数可以表示更大的数字,但中等大小的数字的(绝对)误差成本更高。如果事先知道要表示的数字有多大,定点数可以获得更好的精度,因此可以将小数点放在最准确的位置。但如果不知道正在处理的单位是什么,浮点数是更好的选择,因为它们可以以足够的精度表示广泛的范围。


-2

创建时就已经确定了,定点数不仅有固定数量的小数位(数字)而且在数学上表示为负幂。这对机械计算器非常有用:

例如,某物品的价格是 USD 23.37(Q=小数点后2位)。机器知道小数点应该在哪里!


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

-7

取数字123.456789

  • 作为整数,这个数字将是123
  • 作为定点数(2),这个数字将是123.46(假设你四舍五入)
  • 作为浮点数,这个数字将是123.456789

浮点数可以让你用极高的精度表示大多数数字。 定点数精度较低,但对计算机来说更简单。


15
你能够写一个数字的精度不取决于它是浮点数、整数还是定点数。它取决于你可用的有效数字位数。例如,INT_MAX是一个可以被int精确表示的数字,但不能被float表示,因为它们没有足够的31位精度来精确表示它。 - Kian
2
固定小数点是最精确的,只要其大小能够处理所涉及的数字。当你使用固定小数点数进行计算时,若计算余数超过了小数位限制,则会发生四舍五入。而使用浮点数进行计算时,如果加上一个非常小的数和一个非常大的数,则可能得到一个非常不准确的值。在这种情况下,数字会丢失而没有进行四舍五入。 - Andrew Norman
1
这是具有误导性和错误的。固定点意味着小数点后的位数是固定的,但它并不代表它有多少精度。 - Oscar Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接