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

Floating point 浮点是如何存储的?什么时候重要?,floating-point,rounding-error,Floating Point,Rounding Error,接下来,似乎有些数字根本不能用浮点表示,而是近似值 浮点数是如何存储的 对于不同的尺寸有共同的标准吗 如果我使用浮点,我需要注意什么样的陷阱 它们是否具有跨语言兼容性(即,通过TCP/IP将一个浮点数从python程序发送到C程序需要进行哪些转换)?我记得32位浮点数的存储使用24位表示实际数字,剩余的8位用作10的幂,确定小数点的位置 我对这个问题有点生疏,因为…标准是 当然,当IEE754不够好时,还有其他存储数字的方法。Java的BigDecimal等库可用于大多数平台,并且可以很好地映射

接下来,似乎有些数字根本不能用浮点表示,而是近似值

浮点数是如何存储的

对于不同的尺寸有共同的标准吗

如果我使用浮点,我需要注意什么样的陷阱


它们是否具有跨语言兼容性(即,通过TCP/IP将一个浮点数从python程序发送到C程序需要进行哪些转换)?

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

我对这个问题有点生疏,因为…

标准是

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

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

是的,有问题


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

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


在C++中,一个好的经验法则是,一个浮点给你7个数字的精度,而一个双给你15个数字。另外,如果您对如何测试相等性感兴趣,可以查看问题线程。

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

如果您真的担心浮点舍入错误,大多数语言提供的数据类型都没有浮点错误。SQL Server具有十进制和货币数据类型。Net具有十进制数据类型。它们不像Java中的BigDecimal那样具有无限精度,但精确到定义小数点的数量。因此,您不必担心键入的美元值$4.58会被保存为浮点值4.57999999997。如上所述,在显示大多数系统上浮点数字的存储方式方面做得很好

下面是一些常见的问题:

  • 最大的问题是,您几乎不想比较两个浮点数是否相等(或不相等)。您将希望使用大于/小于比较
  • 对浮点数执行的操作越多,舍入误差越大
  • 精度受分数大小的限制,因此您可能无法正确添加由几个数量级分隔的数字。(例如,您将无法将1E-30添加到1E30。)
作为对这一问题的后续行动 似乎有些数字无法输入 用浮点表示, 而是近似的

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

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

如果我使用浮点,我需要注意什么样的陷阱? 它们是否具有跨语言兼容性(即,我需要处理哪些转换才能 通过TCP/IP从python程序向C程序发送浮点数)

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

非常罕见的怪癖:

  • IEEE754定义了SNAN(信令NAN)和QNAN(安静NAN)。前者会导致一个陷阱,当处理器加载时,它会强制处理器调用处理程序例程。后者不会这样做。因为语言设计者不喜欢SNAN中断他们的工作流程并支持他们强制执行对处理程序例程的支持,所以SNAN几乎总是默默地转换为QNAN。 因此,不要依赖1:1的原始转换。但同样:这是非常罕见的,只有在NaN出现时才会发生 我们在场

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


这篇文章详细解释了有关浮点数的问题。Related post&一篇非常著名的关于计算机中浮点数表示的白皮书-