将浮点数与整数及其二进制表示进行比较

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 的情况下很好地将浮点数格式化为字符串

浮点数

将浮点数与数组中的值进行比较时,“TypeError:只能将整数标量数组转换为标量索引”

python课程设计笔记整数浮点数与字符串

Python变量与数据类型-数据类型

计算机中的定点数与浮点数 浮点数用 正负位 幕数 数字部分来表示