38

在跟进这个问题时,似乎有些数字根本不能用浮点表示,而是近似的。

浮点数是如何存储的?

不同尺寸是否有共同标准?

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

它们是否跨语言兼容(即,我需要处理哪些转换才能通过 TCP/IP 将浮点数从 python 程序发送到 C 程序)?

4

9 回答 9

27

如前所述,关于 IEEE 754 的 Wikipedia 文章很好地展示了浮点数在大多数系统上的存储方式。

现在,这里有一些常见的陷阱:

  • 最大的问题是您几乎不想比较两个浮点数是否相等(或不相等)。您将希望使用大于/小于比较。
  • 对浮点数执行的操作越多,舍入误差就越大。
  • 精度受分数大小的限制,因此您可能无法正确添加相隔几个数量级的数字。(例如,您将无法将 1E-30 添加到 1E30。)
于 2008-09-11T16:20:27.553 回答
5

标准是IEEE 754

当然,当 IEE754 不够好时,还有其他存储数字的方法。Java 之类的库BigDecimal可用于大多数平台,并且可以很好地映射到 SQL 的数字类型。符号可用于无理数,不能以二进制或十进制浮点数准确表示的比率可以存储为比率。

于 2008-09-11T15:52:38.680 回答
5

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

于 2008-09-11T16:01:55.837 回答
4

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

在 C++ 中,一个好的经验法则是认为浮点数给您 7 位精度,而双精度数给您 15 位。此外,如果您有兴趣了解如何测试相等性,可以查看这个问题线程。

于 2008-09-11T16:00:04.810 回答
3

在跟进这个问题时,似乎有些数字根本不能用浮点数表示,而是近似的。

正确的。

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

正如其他海报已经提到的那样,几乎完全是 IEEE754 及其继任者 IEEE754R。谷歌搜索它会给你上千种解释以及位模式及其解释。如果您仍然无法获得它,那么仍然有两种常见的 FP 格式:IBM 和 DEC-VAX。对于一些深奥的机器和编译器(BlitzBasic、TurboPascal),有一些奇怪的格式。

如果我使用浮点数,我需要注意哪些问题?它们是否跨语言兼容(即,我需要处理哪些转换才能通过 TCP/IP 将浮点数从 python 程序发送到 C 程序)?

几乎没有,它们是跨语言兼容的。

非常罕见的怪癖:

  • IEEE754 定义了 sNaNs(信令 NaNs)和 qNaNs(安静 NaNs)。前者会导致一个陷阱,如果加载,它会强制处理器调用处理程序例程。后者不这样做。因为语言设计者讨厌 sNaN 中断他们的工作流程并支持它们强制支持处理程序例程的可能性,所以 sNaN 几乎总是默默地转换为 qNaN。所以不要依赖 1:1 的原始转换。但同样:这是非常罕见的,只有在存在 NaN 时才会发生。

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

于 2009-12-07T21:42:58.877 回答
2

这篇题为“IEEE 标准 754 浮点数”的文章可能会有所帮助。老实说,我不完全确定我是否理解您的问题,所以我不确定这是否会有所帮助,但我希望它会有所帮助。

于 2008-09-11T15:52:58.697 回答
2

是的,有二进制浮点算术的 IEEE 标准(IEEE 754)

当以二进制形式存储时,该数字分为三部分,符号、指数和分数。

于 2008-09-11T15:56:08.127 回答
2

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

于 2008-09-11T16:10:42.337 回答
0

我记得是一个 32 位浮点数使用 24 位存储实际数字,其余 8 位用作 10 的幂,确定小数点在哪里。

我对这个问题有点生疏......

于 2008-09-11T15:49:30.170 回答