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定义了SNAN(信令NAN)和QNAN(安静NAN)。前者会导致一个陷阱,当处理器加载时,它会强制处理器调用处理程序例程。后者不会这样做。因为语言设计者不喜欢SNAN中断他们的工作流程并支持他们强制执行对处理程序例程的支持,所以SNAN几乎总是默默地转换为QNAN。 因此,不要依赖1:1的原始转换。但同样:这是非常罕见的,只有在NaN出现时才会发生 我们在场
- 如果在不同的计算机之间共享文件,则可能会出现endianness问题(字节顺序错误)。它很容易被检测到,因为你得到的是数字的NaN