浮点如何存储?什么时候重要?
在解决这个问题时,似乎有些数字根本不能用浮点表示,而是近似的。
浮点数如何存储?
有不同尺寸的通用标准吗?
如果我使用浮点数,需要注意哪些陷阱?
它们是否跨语言兼容(即,为了通过TCP / IP从python程序向C程序发送浮点数,我需要处理哪些转换)?
-亚当
解决方案
回答
我记得是一个32位浮点数,使用24位实际数字存储,其余8位用作10的幂,确定小数点在哪里。
我对这个主题有点不满意。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回答
该标准是IEEE 754.
当然,当IEE754不够好时,还有其他方法可以存储数字。像Java的BigDecimal这样的库可用于大多数平台,并且可以很好地映射到SQL的数字类型。符号可以用于无理数,不能以二进制或者十进制浮点数精确表示的比率可以存储为比率。
回答
标题为" IEEE标准754浮点数"的文章可能会有所帮助。老实说,我不太确定我是否了解问题,因此不确定是否会有所帮助,但希望会有所帮助。
回答
是的,存在二进制浮点算术的IEEE标准(IEEE 754)
当以二进制形式存储时,数字分为三部分,符号,指数和分数。
回答
基本上,在浮点数中我们需要担心的是,精度位数有限。在测试相等性时,或者程序实际上需要的精度比该数据类型所提供的精度高时,这可能会导致问题。
在C ++中,一个好的经验法则是认为浮点数给我们7位数的精度,而双精度数给我们15的精度。另外,如果我们想知道如何测试相等性,可以查看此问题线程。
回答
至于问题的第二部分,除非性能和效率对项目很重要,否则我建议我们将浮点数据作为字符串通过TCP / IP传输。这样可以避免字节对齐之类的问题,并简化调试。
回答
每位计算机科学家应了解的有关浮点算法的文章中,都对浮点数问题进行了详尽的解释。
回答
如果我们真的担心浮点舍入错误,则大多数语言都提供没有浮点错误的数据类型。 SQL Server具有Decimal和Money数据类型。 .Net具有十进制数据类型。它们不像Java中的BigDecimal那样具有无限的精度,但是可以精确到为其定义的小数点位数。因此,我们不必担心输入的美元值会变成$ 4.58并保存为4.579999999999997的浮点值
回答
如前所述,有关IEEE 754的Wikipedia文章很好地展示了如何在大多数系统上存储浮点数。
现在,这是一些常见的陷阱:
- 最大的问题是,我们几乎永远都不想比较两个浮点数是否相等(或者不相等)。我们将要使用大于/小于大于。
- 我们对浮点数执行的操作越多,舍入误差就越大。
- 精度受分数的大小限制,因此我们可能无法正确添加相隔数个数量级的数字。 (例如,我们将无法在1E30上添加1E-30。)
回答
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,因此很容易检测到。