将浮点数与整数及其二进制表示进行比较
Posted
技术标签:
【中文标题】将浮点数与整数及其二进制表示进行比较【英文标题】:comparing float with integer and their binary representations 【发布时间】:2022-01-09 07:28:55 【问题描述】:因此,例如 4 可以用 8 位表示为 00000100,而 4.0 可以用 8 位表示为 01111000,使用超 4 表示法和浮点表示法。所以他们不是一回事。但是,当我将 4 与 4.0 进行比较时,Python 和 C 都会给出 1 作为结果。如何 ?由于我提到的原因,他们不应该意味着不同的事情来做电脑吗?
【问题讨论】:
【参考方案1】:我认为您的困惑来自implicit type conversion,它发生在 C 和 Python 中。事实上 我在上面链接到的***页面使用与您的问题相同的形式,只是数字不同。
其他编程语言的工作方式不同。例如,在没有任何隐式类型转换的 Rust 或 Haskell 中,编译器会抱怨并且这段代码不会编译。请参阅Rust example via Godbolt。
作为 C 编译器在做什么的具体演示,这里有另一个 example in godbolt。它显示在执行浮点比较(通过feq
)之前将int
参数转换为float
(通过fcvt
指令)。 Python 做了类似的事情,但由于动态调度有点复杂,implementation is here 和PyLong_Check
下的所有内容都处理浮点数与整数比较的情况。
请注意,大多数数据类型不会直接比较存储在内存中的数据。例如,IEEE 754 浮点数有两个零(+1.0 和 -1.0),但它们比较为彼此相等。某些语言允许您比较内存的原始字节,例如memcmp
在 C 中,但这通常不是您想要做的。
【讨论】:
【参考方案2】:虽然以这些二进制形式表示的这两个值(4 和 4.0)确实可以表示不同的 8 位值,但在比较操作中,Python 和 C 比较输入的值,同时考虑到它们各自的类型。这从完全依赖二进制的操作中彻底改变了比较的行为。
Python documentation 状态:
Python 完全支持混合算术:当一个二元算术运算符具有不同数值类型的操作数时,具有“较窄”类型的操作数被扩大到另一个,其中整数比浮点窄,浮点比复数窄.不同类型的数字之间的比较就像是在比较这些数字的确切值
因此,如果您要将 4 与 4.0 进行比较,则会将其视为两个数字都是较宽的类型,从而允许进行混合算术比较。因此,在这种情况下认为 4 与 4.0 不同,从表面上看,这有点误导,因为语言具有特定的行为来以级别的方式比较它们。
【讨论】:
以上是关于将浮点数与整数及其二进制表示进行比较的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有不必要的十进制 0 的情况下很好地将浮点数格式化为字符串