在跟进这个问题时,似乎有些数字根本不能用浮点表示,而是近似的。
浮点数是如何存储的?
不同尺寸是否有共同标准?
如果我使用浮点数,我需要注意哪些问题?
它们是否跨语言兼容(即,我需要处理哪些转换才能通过 TCP/IP 将浮点数从 python 程序发送到 C 程序)?
在跟进这个问题时,似乎有些数字根本不能用浮点表示,而是近似的。
浮点数是如何存储的?
不同尺寸是否有共同标准?
如果我使用浮点数,我需要注意哪些问题?
它们是否跨语言兼容(即,我需要处理哪些转换才能通过 TCP/IP 将浮点数从 python 程序发送到 C 程序)?
如前所述,关于 IEEE 754 的 Wikipedia 文章很好地展示了浮点数在大多数系统上的存储方式。
现在,这里有一些常见的陷阱:
标准是IEEE 754。
当然,当 IEE754 不够好时,还有其他存储数字的方法。Java 之类的库BigDecimal
可用于大多数平台,并且可以很好地映射到 SQL 的数字类型。符号可用于无理数,不能以二进制或十进制浮点数准确表示的比率可以存储为比率。
至于您问题的第二部分,除非性能和效率对您的项目很重要,否则我建议您通过 TCP/IP 将浮点数据作为字符串传输。这可以让您避免字节对齐等问题,并简化调试。
基本上,在浮点数中您需要担心的是精度位数有限。这可能会在测试相等性时导致问题,或者如果您的程序实际上需要比该数据类型提供的更多位数的精度。
在 C++ 中,一个好的经验法则是认为浮点数给您 7 位精度,而双精度数给您 15 位。此外,如果您有兴趣了解如何测试相等性,可以查看这个问题线程。
在跟进这个问题时,似乎有些数字根本不能用浮点数表示,而是近似的。
正确的。
浮点数是如何存储的?不同尺寸是否有共同标准?
正如其他海报已经提到的那样,几乎完全是 IEEE754 及其继任者 IEEE754R。谷歌搜索它会给你上千种解释以及位模式及其解释。如果您仍然无法获得它,那么仍然有两种常见的 FP 格式:IBM 和 DEC-VAX。对于一些深奥的机器和编译器(BlitzBasic、TurboPascal),有一些奇怪的格式。
如果我使用浮点数,我需要注意哪些问题?它们是否跨语言兼容(即,我需要处理哪些转换才能通过 TCP/IP 将浮点数从 python 程序发送到 C 程序)?
几乎没有,它们是跨语言兼容的。
非常罕见的怪癖:
IEEE754 定义了 sNaNs(信令 NaNs)和 qNaNs(安静 NaNs)。前者会导致一个陷阱,如果加载,它会强制处理器调用处理程序例程。后者不这样做。因为语言设计者讨厌 sNaN 中断他们的工作流程并支持它们强制支持处理程序例程的可能性,所以 sNaN 几乎总是默默地转换为 qNaN。所以不要依赖 1:1 的原始转换。但同样:这是非常罕见的,只有在存在 NaN 时才会发生。
如果在不同计算机之间共享文件,您可能会遇到字节顺序问题(字节顺序错误)。它很容易检测到,因为您得到的是数字的 NaN。
这篇题为“IEEE 标准 754 浮点数”的文章可能会有所帮助。老实说,我不完全确定我是否理解您的问题,所以我不确定这是否会有所帮助,但我希望它会有所帮助。
是的,有二进制浮点算术的 IEEE 标准(IEEE 754)
当以二进制形式存储时,该数字分为三部分,符号、指数和分数。
如果您真的担心浮点舍入错误,大多数语言都提供没有浮点错误的数据类型。SQL Server 具有 Decimal 和 Money 数据类型。.Net 具有 Decimal 数据类型。它们不像 Java 中的 BigDecimal 那样具有无限精度,但它们精确到定义的小数点数。因此,您不必担心输入为 $4.58 的美元值会被保存为浮点值 4.579999999999997
我记得是一个 32 位浮点数使用 24 位存储实际数字,其余 8 位用作 10 的幂,确定小数点在哪里。
我对这个问题有点生疏......