固定点vs浮点数

use*_*451 94 computer-science numbers representation

由于难以在Google上阅读有关它们的定义,我无法理解定点和浮点数.但是我读过的没有提供一个简单的解释,说明它们到底是什么.我能用例子得到一个简单的定义吗?

Gab*_*abe 128

固定点编号具有为整数部分(小数点左侧的部分)保留的特定位数(或数字)和为小数部分保留的特定位数(小数点右侧的部分)点).无论您的数量有多大或多小,它都会为每个部分使用相同的位数.例如,如果您的定点格式是十进制的,IIIII.FFFFF那么您可以表示的最大数字将是99999.99999最小的数字00000.00001.处理这些数字的每一段代码都必须具有小数点所在的内置知识.

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

  • @BrianGordon:我没有忘记标志位; 我故意忽略它们以便有一个简单的**描述,而不必担心最小/最大和最小/最大之间的差异.我还故意省略了指数偏差(与任意两个数之间的离散值的数量无关),NaNs,无穷大,归一化,逐渐下溢,带符号的零,大多数浮点数是二进制的(这允许第一位)被遗漏的尾数)以及说明该概念所不需要的许多其他方面. (26认同)
  • 好吧,你忘了浮点数几乎总是有符号,所以最小值真的是`-9.9999999e + 50`. (7认同)
  • 还有指数偏差,因此您可以表示介于0和1之间的离散值远远超过1,000,000和1,000,001之间的离散值.浮点运算出现了很多复杂问题,例如,当偏差不足以提高精度时,确保不报告0作为两个非常相似的数字之间的差异. (4认同)
  • @NickMiller:很抱歉这个混乱,但我说的是非零数字.我的示例格式可以表示0,0.00001,0.00002,...,99999.99998,99999.99999. (4认同)
  • @zer0uno:关键是答案说的是 10 个 *digits*,而不是 10 *bits*,正如许多熟悉计算机算术的人所期望的那样。在讨论了二进制表示之后,答案切换到了所有十进制的例子。所以 9.9999999+e50 是 9 的 1 位数字,9999999 的 7 位数字,50 的 2 位数字,总共 (1 + 7 + 2 =) 10。 (3认同)
  • 为什么最小定点数为00000.00001?我期望看到的是“ 00000.00000”。另外,您是否有参考资料更详细地介绍定点数? (2认同)
  • 谁能解释一下他是如何得到 10 位浮点数的“9.9999999e+50”和“0.0000001e-49”的? (2认同)
  • @CharlieParker,2 位数字足以表示 100 个不同的指数(-49 到 50)。如果你有 2 位数字*加*一个符号位,你可以有 200 个不同的指数(-99 到 100),但我故意从我的描述中排除符号位以简化事情。 (2认同)

Vau*_*ato 30

固定点数仅表示小数点后面有固定的位数.浮点数允许小数点后的数字位数不同.

例如,如果您有一种方法可以存储小数点后正好需要四位数的数字,那么它就是固定点.没有这个限制,它是浮点数.

通常,当使用固定点时,程序员实际使用整数,然后假设某些数字超出小数点.例如,我可能想要保持两位精度,因此值100意味着实际意味着1.00,101意味着1.01,12345意味着123.45等.

浮点数是更通用的,因为它们可以以相同的方式表示非常小或非常大的数字,但是对于小数位所在的位置必须有额外的存储有一点小的惩罚.

  • 当您开始使用浮点数进行计算时(例如,如果您将一个很小的浮点数和一个很大的浮点数加在一起),浮点数的使用就成为一个问题。由于求和结果必须代表两个极值,并且小数点后的小数位被舍去(并且不四舍五入),因此求和结果会失去准确性。 (2认同)
  • 指数值在浮点中的潜在使用也会导致期望标准数字的计算机系统出现问题 (2认同)

小智 7

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

例如,如果12.34需要存储数字,而我们只需要小数点后两位精度,则将数字乘以100得到1234。在对这个数字进行数学运算时,我们会使用这个规则集。将5620或添加56.20到此数字将产生6854data 或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"
Run Code Online (Sandbox Code Playgroud)

浮点数在编程中是一个完全不同的故事。浮点数的当前标准使用类似 23 位的数字数据,8 位的指数和 1 位来表示符号。有关这方面的更多信息,请参阅此 Wikipedia 链接。


Spa*_*rky -7

拨打电话123.456789

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

浮点可以让您以极高的精度表示几乎所有数字。固定的不太精确,但对于计算机来说更简单。

  • 写入数字的精度与是否以浮点数、整数或定点数写入无关。它与可用的有效位数有关。例如,INT_MAX 是一个可以精确表示为 int 的数字,但不能表示为 float,因为它们没有精确表示它所需的 31 位精度。 (15认同)
  • 固定是最精确的,只要其大小能够处理相关数字即可。当您使用定点数进行数学计算时,当计算的余数超过小数限制时,就会发生舍入。对于浮点数,如果将一个非常小的数字与一个非常大的数字相加,您可能会得到一个非常不准确的值。发生这种情况时,数字会丢失而不会四舍五入 (2认同)