比较它们的位表示中的浮点数

scz*_*zzo 8 c c++ floating-point objective-c

假设我想要一个带有两个浮点数 (xy)的函数,我想不使用它们的float表示来比较它们,而是使用它们作为 32 位的按位表示unsigned int。也就是说,像这样的数字-495.5具有位表示0b110000111110010111000000000000000xC3E5C000作为float,并且我有一个unsigned int具有相同位表示(对应于十进制值3286614016,我不在乎)。有没有什么简单的方法可以让我<=只使用它们各自unsigned int对应的信息中包含的信息来对这些浮点执行这样的操作?

dra*_*ard 4

除非您确保所有原始值都是正数,否则您必须进行带符号的比较。您必须使用与原始浮点类型大小相同的整数类型。每个芯片可能具有不同的内部格式,因此将不同芯片的值作为整数进行比较很可能会给出误导性的结果。

大多数浮点格式看起来像这样:sxxxmmmm

s是符号位
xxx是指数
mmmm是尾数

所表示的值将类似于:1mmm << (xxx-k)

1mmm1因为除非该值为零,否则存在隐含的前导位。

如果xxx < k那样的话,这将是一个右移。k接近但不等于 可以表示的最大值的一半xxx。它根据尾数的大小进行调整。

总而言之,忽略NaN,将浮点值与相同大小的有符号整数进行比较将产生有意义的结果。它们以这种方式设计,以便浮点比较的成本不会比整数比较高。有编译器优化可以关闭NaN检查,以便在芯片的浮点格式支持的情况下,比较是直接整数比较。

作为整数,NaN大于无穷大大于有限值。如果尝试无符号比较,所有负值都将大于正值,就像有符号整数转换为无符号整数一样。