定点数与浮点数
Posted
技术标签:
【中文标题】定点数与浮点数【英文标题】:Fixed point vs Floating point number 【发布时间】:2011-11-23 09:38:02 【问题描述】:我只是无法理解定点和浮点数,因为在 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)。 我认为这是一个相关的讨论(特别是用浮点数描述陷阱和用定点更好的精度以及为什么你永远不想将钱描述为浮点数。***.com/questions/6320209/… Random link where the topics are mentioned "OpenGL® ES OpenGL ES 包括浮点和定点系统的配置文件和 EGL™ 规范..." 你为什么不接受答案?你缺少什么?想要悬赏来填补您需要的缺失知识? 【参考方案1】:定点数具有为整数部分(小数点左侧的部分)保留的特定位数(或数字)和为小数部分(右侧的部分)保留的特定位数小数点)。无论您的数字有多大或多小,它总是会为每个部分使用相同数量的位数。例如,如果您的定点格式是十进制 IIIII.FFFFF
,那么您可以表示的最大数字将是 99999.99999
,而最小的非零数字将是 00000.00001
。处理这些数字的每一段代码都必须内置知道小数点在哪里。
浮点数不为整数部分或小数部分保留特定位数。相反,它为数字保留一定数量的位(称为 mantissa 或 significand),并保留一定数量的位来表示其中的 where小数位的数字(称为指数)。因此,占用 10 位数字并为指数保留 2 位数字的浮点数可能表示最大值 9.9999999e+50
和最小的非零值 0.0000001e-49
。
【讨论】:
你忘记了浮点数几乎总是有符号的,所以最小值实际上是-9.9999999e+50
。
还有指数偏差,因此您可以表示 0 和 1 之间的离散值,而不是 1,000,000 和 1,000,001 之间的离散值。浮点运算会出现很多复杂情况,例如当偏差不足以提高精度时,确保不会将 0 报告为两个非常相似的数字之间的差异。
@BrianGordon:我没有忘记符号位;我故意忽略它们是为了得到一个简单的描述,而不必担心最小/最大和最小/最大之间的区别。我还故意省略了指数偏差(与任何两个数字之间的离散值的数量无关)、NaN、无穷大、归一化、逐渐下溢、带符号的零、大多数浮点数是二进制的事实(允许第一位的尾数被忽略),以及许多其他方面对于说明这个概念是不必要的。
@NickMiller:很抱歉造成混乱,但我说的是非零数字。我的示例格式可以表示 0、0.00001、0.00002、...、99999.99998、99999.99999。
@zer0uno:关键是答案是 10 个数字,而不是许多熟悉计算机算术的人所期望的 10 个位。在讨论了二进制表示之后,答案转向了所有十进制的示例。所以 9.9999999+e50 是 9 的 1 位,9999999 是 7 位,50 是 2 位,总共 (1 + 7 + 2 =) 10。【参考方案2】:
定点数仅表示小数点后有固定位数。浮点数允许小数点后的位数不同。
例如,如果您有一种存储数字的方法,它要求小数点后正好有四位数字,那么它就是定点数。没有这个限制,它就是浮点数。
通常,当使用定点时,程序员实际上使用了一个整数,然后假设某些数字超出了小数点。例如,我可能希望保留两位精度,因此值 100 表示实际表示 1.00,101 表示 1.01,12345 表示 123.45,等等。
浮点数更通用,因为它们可以以相同的方式表示非常小的或非常大的数字,但是必须为小数位的位置提供额外的存储空间会带来一些损失。
【讨论】:
当您开始使用它们进行计算时,浮点使用会成为一个问题,例如,如果您将一个非常小的浮点数和一个非常大的浮点数相加。求和的结果会失去准确性,因为它必须表示一个具有两个极值的数字,并且小数部分会被剪掉(并且不会四舍五入)。 在浮点数中使用指数值可能会导致计算机系统出现标准数字问题【参考方案3】:据我了解,定点算术是使用整数完成的。其中小数部分存储在固定数量的位中,或者将数字乘以需要多少位小数精度。
例如,如果需要存储数字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 位用于符号。 See this Wikipedia link for more information on this.
【讨论】:
【参考方案4】:术语“定点”是指数字的相应表示方式,在小数点之后(有时在小数点之前)有固定位数。 使用浮点表示,小数点的位置可以相对于数字的有效数字“浮动”。 例如,具有统一小数点放置约定的定点表示可以表示数字 123.45、1234.56、12345.67 等,而浮点表示还可以表示 1.234567、123456.7、0.00001234567、1234567000000000 等。
【讨论】:
【参考方案5】:它是创建的,定点数不仅在点(数字)之后有一些固定的小数位数,而且在数学上用负幂表示。非常适合机械计算器:
例如,smth 的价格是 23.37 美元(Q=点后 2 位数。)机器知道点应该在哪里!
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案6】:接电话123.456789
作为一个整数,这个数字是 123 作为一个不动点 (2),这 数字是 123.46(假设你四舍五入) 作为一个浮点数,这个数字是 123.456789浮点数可让您以极高的精度表示大多数数字。固定不太精确,但对计算机来说更简单..
【讨论】:
写出数字的精度与写成浮点数、整数还是定点数无关。它与您可用的有效位数有关。例如,INT_MAX 是一个可以精确表示为 int 的数字,但不能表示为浮点数,因为它们没有精确表示它所需的 31 位精度。 fixed 是最精确的,只要它的大小可以处理有问题的数字。当您使用定点数进行数学运算时,当计算的余数超过小数限制时会发生舍入。使用浮点数,如果将非常小的数字与非常大的数字相加,则可能会得到非常不准确的值。当发生这种情况时,数字会丢失而不四舍五入 这是误导和错误的。定点是指小数点后的位数是固定的。它没有说明它有多少精度。以上是关于定点数与浮点数的主要内容,如果未能解决你的问题,请参考以下文章