定点与浮点数


109

由于难以在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)。
巴特S.14年

1
我认为这是一个相关的讨论(尤其是介绍与浮点数的陷阱,并与定点更好的精度,为什么你从来没有想descibe钱为float。stackoverflow.com/questions/6320209/...
安德鲁·诺曼

提到主题的随机链接 “OpenGL®ES OpenGL ES包括用于浮点和定点系统的配置文件以及EGL™规范...”
Red Pea

Answers:


145

定点数具有为整数部分(小数点左边的部分)保留的特定位数(或位数),以及为小数部分(小数点右边的部分)保留的特定位数。点)。无论您的数字大小,它的每个部分将始终使用相同的位数。例如,如果定点格式为十进制,IIIII.FFFFF则可以表示的最大数字为99999.99999,而最小的非零数字为00000.00001。处理此类数字的每一位代码都必须具有小数点在哪里的内置知识。

浮点数不会为整数部分或小数部分保留特定位数。相反,它保留了一批具有一定比特数(称为尾数有效数字)和一定的位数说那里是数小数位位于(被称为内指数)。因此,占用10位数字并保留2位数字用于指数的浮点数可能表示的最大值9.9999999e+50和最小的非零值0.0000001e-49


8
好吧,您忘记了浮点数几乎总是带符号的,因此最小值实际上是-9.9999999e+50
Brian Gordon

4
此外,还有指数偏差,因此您可以表示0到1之间的离散值比1,000,000到1,000,001之间的离散值大得多。浮点运算会带来很多复杂性,例如,当偏差不足以提高精度时,请确保不要报告两个非常相似的数字之间的差为0。
Brian Gordon

28
@BrianGordon:我没有忘记符号位;我故意忽略它们,以便进行简单描述,而不必担心最小/最大与最小/最大之间的差异。我还特意省去了指数偏差(与任何两个数字之间的离散值数量无关),NaN,无穷大,归一化,渐进下溢,有符号零,大多数浮点数都是二进制的事实(允许第一位)剩下的尾数),以及许多其他方面对于说明该概念来说都是不必要的。
加布

2
为什么最小定点数的截止值是多少00000.00001?我希望能看到00000.00000。另外,您是否有参考资料更详细地介绍定点数?
Nicholas Miller

4
@NickMiller:对不起,我很困惑,但是我说的是非零数字。我的示例格式可以表示0、0.00001、0.00002,...,99999.99998、99999.99999。
加布2014年

31

固定点数仅表示小数点后有固定位数。浮点数允许小数点后的位数变化。

例如,如果您有一种存储数字的方式,该数字要求小数点后恰好需要四位数,那么它就是定点数。没有那个限制,它就是浮点数。

通常,使用定点时,程序员实际上使用整数,然后假设某些数字超出了小数点。例如,我可能希望保持两位数的精度,因此值100实际表示1.00,101表示1.01,12345表示123.45,依此类推。

浮点数是更通用的用途,因为它们可以用相同的方式表示非常小的数字或很大的数字,但是对于必须保留小数点后缀的位置会有一点损失。


2
当您开始使用它们进行计算时(例如,如果您将一个很小的浮点数和一个很大的浮点数加在一起),浮点数的使用就成为一个问题。由于求和结果必须代表两个极值,并且小数点后的小数位会被舍去(并且不四舍五入),因此求和结果会失去准确性。
Andrew Norman

2
指数值在浮点中的潜在使用也可能导致期望标准数字的计算机系统出现问题
Andrew Norman

5

据我了解,定点算法是使用整数完成的。其中小数部分以固定的位数存储,或者该数字乘以需要多少位数的十进制精度。

例如,如果12.34需要存储数字,并且我们只需要小数点后两位的精度,则将该数字乘以100得到1234。在对该数字进行数学运算时,我们将使用此规则集。在这个数字上加上562056.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,但符号。有关更多信息,请参见此Wikipedia链接。


3

术语“不动点”是指数字的相应表示方式,即在小数点之后(有时在小数点之前)具有固定的数字位数。使用浮点表示法时,小数点的位置可以相对于数字的有效数字“浮动”。例如,具有统一小数点位置约定的定点表示形式可以表示数字123.45、1234.56、12345.67等,而浮点表示形式可以另外表示1.234567、123456.7、0.00001234567、1234567000000000等。


-6

取号码123.456789

  • 作为整数,该数字为123
  • 作为固定点(2),该数字将为123.46(假设您将其四舍五入)
  • 作为一个浮点数,该数字为123.456789

浮点数使您可以非常精确地表示大多数数字。固定的精度较差,但对计算机而言更简单。


11
可以写数字的精度与它是以浮点数,整数还是定点数书写无关。它与您可用的有效位数有关。例如,INT_MAX是一个可以精确表示为int的数字,但不能表示为浮点数,因为它们没有精确表示它所需的31位精度。
肯(Kian)2013年

1
固定是最精确的,只要其大小能够处理相关数字即可。使用定点数进行数学运算时,当计算的余数超过小数位数限制时,将进行舍入。使用浮点数时,如果将一个很小的数字与一个很大的数字相加,则会得到非常不准确的值。当出现这种情况的数字都将丢失没有四舍五入
安德鲁·诺曼

这是误导和错误的。定点表示小数点后的位数是固定的。它没有说出它有多精确。
奥斯卡·史密斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.