2008-09-11 112 views
32

在跟进到this question后,似乎有些数字根本不能用浮点数表示,而是近似表示。浮点是如何存储的?它什么时候重要?

浮点数如何存储?

是否有不同尺寸的通用标准?

如果我使用浮点,需要注意哪些问题?

它们是跨语言兼容的吗(例如,我需要处理哪些转换以将一个浮点数从Python程序发送到基于TCP/IP的C程序)?

- 亚当

回答

22

如上所述,Wikipedia article on IEEE 754在显示大多数系统上如何存储浮点数方面做得很好。

现在,这里有一些常见的问题:

  • 最大的是,你几乎从来没有要比较相等(或等于)两个浮点数。您需要使用大于/小于比较。
  • 您对浮点数进行的操作越多,舍入误差就会变得越重要。
  • 精度受分数大小的限制,因此您可能无法正确添加相隔几个数量级的数字。 (例如,您将无法添加到1E30 1E30)
0

记得什么是一个32位浮点,使用24位对一个实际数目存储,并且保持8位用作10的幂,确定在何处小数点。

我关于这个问题寿有点生疏...

5

的标准是IEEE 754

当然,当IEE754还不够好的时候,还有其他方法可以存储数字。 Java的BigDecimal等库可用于大多数平台,并可以很好地映射到SQL的数字类型。符号可以用于非理性数字,而不能用二进制或十进制浮点精确表示的比例可以按比例存储。

2

这个标题为“IEEE Standard 754 Floating Point Numbers”的article可能会有帮助。说实话,我并不完全确定自己正在理解你的问题,所以我不确定这会有帮助,但我希望它会有帮助。

3

基本上你需要担心的浮点数是有限的精度数位数。当测试相等性时,这可能会导致问题,或者如果您的程序实际上需要比数据类型所提供的精度更多的数字。

在C++中,一个很好的经验法则是认为浮点数为7位数的精度,而double为15。 this问题线程。

5

对于问题的第二部分,除非性能和效率对您的项目很重要,否则我建议您将浮点数据作为字符串通过TCP/IP传输。这可以避免诸如字节对齐之类的问题,并且会缓解调试。

1

如果您真的担心浮点舍入错误,大多数语言都会提供没有浮点错误的数据类型。 SQL Server具有Decimal和Money数据类型。 .Net具有十进制数据类型。它们不像Java中的BigDecimal那样具有无限的精度,但它们精确到它们定义的小数点数。所以你不必担心你输入的美元价值为4美元。58保存为浮点数值4.579999999999997

3

在跟进这个问题, 似乎有些数字不能被浮点在所有代表 ,而是近似的。

正确。

浮点数如何存储? 是否有不同大小的共同标准?

正如其他海报已经提到的,几乎只有IEEE754及其后继者 IEEE754R。谷歌搜索它给你一千个解释与位模式和他们的解释。 如果仍然有问题需要解决,还有两种常见的FP格式:IBM和DEC-VAX。对于一些深奥的机器和编译器(BlitzBasic,TurboPascal),有一些奇怪的格式。

如果我使用浮点,需要注意哪些问题? 他们跨语言兼容(即,我需要处理什么转换以 发送一个浮点数从Python程序到C程序通过TCP/IP)?

实际上没有,它们是跨语言兼容的。

非常罕见发生的历史怪癖:

  • IEEE754限定sNaNs(信号NaN)和qNaNs(提示NaN)。前者会导致陷阱,迫使处理器在加载时调用处理程序例程。后者不这样做。因为语言设计者讨厌sNaNs中断他们的工作流程并支持他们强化对处理程序例程的支持的可能性,sNaN几乎总是被悄无声息地转换成qNaNs。 所以不要依赖1:1原始转换。但是,这又是非常罕见的,只有在存在NaNs 时才会发生。

  • 如果共享不同计算机之间的文件,则可能存在排序问题(字节顺序错误)。它很容易被检测到,因为你得到的是数字的NaN。

相关问题