关于舍入错误:如何存储浮点数? 什么时候重要?

关于舍入错误:如何存储浮点数? 什么时候重要?

How is floating point stored? When does it matter?

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

浮点数如何存储?

有不同尺寸的通用标准吗?

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

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


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

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

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

每位计算机科学家应该了解的有关浮点算法的文章中,都对浮点数问题进行了详尽的解释。


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


该标准是IEEE 754。

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


In follow up to this question, it
appears that some numbers cannot be
represented by floating point at all,
and instead are approximated.

正确。

How are floating point numbers stored?
Is there a common standard for the different sizes?

正如其他海报所提到的,IEEE754及其后续版本几乎全部
IEEE754R。谷歌搜索为您提供数千种解释以及位模式及其解释。
如果仍然有问题,可以使用两种常见的FP格式:IBM和DEC-VAX。对于一些深奥的机器和编译器(BlitzBasic,TurboPascal),有一些
奇数格式。

What kind of gotchas do I need to watch out for if I use floating point?
Are they cross-language compatible (ie, what conversions do I need to deal with to
send a floating point number from a python program to a C program over TCP/IP)?

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

极为罕见的怪癖:

  • IEEE754定义了sNaN(信令NaN)和qNaN(安静NaN)。前者会导致陷阱,如果已加载,则迫使处理器调用处理程序例程。后者不这样做。由于语言设计人员讨厌sNaN中断其工作流程并支持他们强制执行对处理程序例程的支持,因此sNaN几乎总是默默地转换为qNaN。
    因此,请勿依赖1:1原始转换。但是再次:这是非常罕见的,仅在NaN发生时才会发生
    存在。

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


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

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


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

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


标题为" IEEE标准754浮点数"的本文可能会有所帮助。老实说,我不太确定我是否理解您的问题,因此不确定是否会有所帮助,但希望会有所帮助。


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


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

我对这个问题有点不满意...


推荐阅读