浮点是如何存储的?什么时候重要?

时间:2008-09-11 15:45:14

标签: floating-point rounding-error

this question的后续行动中,似乎某些数字根本无法用浮点表示,而是近似值。

如何存储浮点数?

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

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

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

- 亚当

10 个答案:

答案 0 :(得分:24)

如前所述,Wikipedia article on IEEE 754可以很好地显示大多数系统上如何存储浮点数。

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

  • 最大的问题是你几乎不想比较两个浮点数的相等(或不等式)。你想要使用大于/小于比较。
  • 对浮点数执行的操作越多,舍入错误就越明显。
  • 精度受分数大小的限制,因此您可能无法正确添加以几个数量级分隔的数字。 (例如,您将无法将1E-30添加到1E30。)

答案 1 :(得分:12)

文章What Every Computer Scientist Should Know About Floating-Point Arithmetic中给出了有关浮点数问题的详尽解释。

答案 2 :(得分:5)

标准是IEEE 754

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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

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

在C ++中,一个好的经验法则是认为一个float给你7位数的精度,而double给你15个。另外,如果你有兴趣知道如何测试相等性,你可以看看{ {3}}提问线程。

答案 5 :(得分:3)

  

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

正确。

  

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

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

  

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

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

极为罕见的怪癖:

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

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

答案 6 :(得分:2)

article标题为“IEEE标准754浮点数”可能会有所帮助。说实话,我不完全确定我理解你的问题所以我不确定这会有所帮助,但我希望它会有所帮助。

答案 7 :(得分:2)

是的,有IEEE Standard for Binary Floating-Point Arithmetic (IEEE 754)

当以二进制形式存储时,数字被分成三个部分,sign,exponent和fraction。

答案 8 :(得分:1)

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

答案 9 :(得分:0)

我记得的是,32位浮点使用24位存储为实际数字,剩余的8位用作10的幂,确定小数点的位置。

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