如何存储浮点数? 什么时候重要?
在这个问题之后 ,似乎有些数字根本不能用浮点数来表示,而是近似的。
浮点数如何存储?
有不同大小的共同标准吗?
如果我使用浮点,需要注意什么types的陷阱?
他们是跨语言兼容的(即,我需要处理什么转换从python程序发送到C程序通过TCP / IP的浮点数)?
-亚当
如前所述, 维基百科关于IEEE 754的文章很好地展示了在大多数系统上如何存储浮点数。
现在,这里有一些常见的陷阱:
- 最大的问题是,你几乎从不想比较两个浮点数的平等(或不平等)。 您将需要使用大于/小于比较。
- 您对浮点数进行的操作越多,舍入误差就越显着。
- 精确度受分数大小的限制,因此您可能无法正确添加相隔几个数量级的数字。 (例如,您将无法将1E-30添加到1E30。)
这篇文章给出了关于浮点数问题的详细解释,这篇文章给出了每个计算机科学家关于浮点算术应该知道的内容 。
标准是IEEE 754 。
当然,当IEE754不够好的时候,还有其他的方法来存储数字。 像Java的BigDecimal
这样的库可以在大多数平台上使用,并很好地映射到SQL的数字types。 符号可以用于非理性的数字,而不能用二进制或十进制浮点精确表示的比例可以按比例存储。
至于你的问题的第二部分,除非你的项目的性能和效率是重要的,那么我build议你将浮点数据作为string通过TCP / IP传输。 这可以避免诸如字节alignment之类的问题,并且会减轻debugging的负担。
基本上你需要担心的浮点数是有限的精度数位数。 当testing相等时,这可能会导致问题,或者如果您的程序实际上需要比数据types所提供的精度更多的数字。
在C ++中,一个好的经验法则是认为浮点数是7位数的精度,而double是15的数值。另外,如果你有兴趣知道如何testing相等性,你可以看看这个问题线程。
在这个问题之后,似乎有些数字根本不能用浮点数来表示,而是近似的。
正确。
浮点数如何存储? 有不同大小的共同标准吗?
正如其他海报已经提到的,几乎只有IEEE754及其后继IEEE754R。 用谷歌search给你千位的解释,位模式和他们的解释。 如果仍然有问题,还有两种常见的FP格式:IBM和DEC-VAX。 对于一些深奥的机器和编译器(BlitzBasic,TurboPascal),有一些奇怪的格式。
如果我使用浮点,需要注意什么types的陷阱? 他们是跨语言兼容的(即,我需要处理什么转换从python程序发送到C程序通过TCP / IP的浮点数)?
实际上没有,它们是跨语言兼容的。
非常罕见的怪癖:
-
IEEE754定义了sNaNs(信令NaNs)和qNaNs(安静的NaNs)。 前者会导致陷阱,迫使处理器在加载时调用处理程序。 后者不这样做。 因为语言devise者讨厌sNaNs中断他们的工作stream程并支持他们强化对处理程序的支持的可能性,sNaN几乎总是被悄无声息地转换成qNaNs。 所以不要依靠1:1的原始转换。 但是,这又是非常罕见的,只有在NaN存在的情况下才会发生。
-
如果共享不同计算机之间的文件,则可能会遇到字节顺序(字节顺序错误)的问题。 这很容易被发现,因为你正在获取数字的NaNs。
是的,有IEEE标准的二进制浮点运算(IEEE 754)
数字分成三部分,符号,指数和分数,当以二进制forms存储时。
本文标题为“IEEE标准754浮点数”可能会有帮助。 说实话,我并不完全确定我正在理解你的问题,所以我不确定这会有帮助,但我希望它会。
如果您真的担心浮点舍入错误,大多数语言都会提供没有浮点错误的数据types。 SQL Server具有Decimal和Money数据types。 .Net具有十进制数据types。 它们不像Java中的BigDecimal那样具有无限的精度,但它们精确到小数点的位置。 所以你不必担心你input的美元价值4.58美元作为浮点值4.579999999999997
我记得32位浮点是用24位存储一个实际的数字,剩下的8位用作10的乘方,决定小数点的位置。
我对这个问题有点生疏