【问题标题】:Type punning doubles into integers and sorted order将双关双打输入整数和排序顺序
【发布时间】:2014-11-02 18:21:27
【问题描述】:

假设有一堆浮点数,那么它们可以按从小到大的排序(即排序)。

如果我将 [1, 2] 浮点数“转换”为如下所示的整数,它们会保持相同的顺序吗?我的意思是,从比较实际位的角度来看,它会保留排序顺序吗?

union number {
  uint64_t i; // [3]
  double f;
};

在根据if 排序时,当我对number 的数组进行排序时,我会得到相同的排序吗?

换句话说,如果:

x.f < y.f

它总是这样认为吗:

x.i < y.i

?

[1] 从我读到的,实际的术语是"type punning"

[2] 我不能简单地“转换”(如uint64_t i = (uint64_t)f),因为这只会截断浮点数,对吧?

[3] 它对int64_tuint64_t 都有效吗?

【问题讨论】:

  • 关于 [3]:它甚至不适用于 int64_tuint64_t 之间的类型双关语。
  • 你到底想达到什么目的?
  • 您可以进行逐位比较,但要小心。首先根据最高有效位进行分区,然后适当处理正负双精度。
  • 不,int64_t,也不起作用...
  • @2501 "radix sort floating point" 给出了一组很好的结果...确切地说,我不是在谈论基数排序,但是是的,这也是一个应用程序.. .

标签: c casting floating-point ieee-754


【解决方案1】:

换句话说,如果:x.f &lt; y.f 是否总是认为:x.i &lt; y.i

不,这不适用于负浮点数。例如,-1 为 0xbff0000000000000,-2 为 0xc000000000000000。

【讨论】:

  • 在带有符号扩展右移运算符的平台上,x.i ^ ((x.i &gt;&gt; 31) &amp; INT_MAX) 会正确排序所有非 NAN 值吗?
  • @supercat 使用无符号并避免该问题。如果你有效地获得了一个有符号的值,那么你可以将它转换为无符号的。
  • 在不使用算术右移、分支或乘法的情况下,是否有任何“好”的方法来生成与(x &amp; (INT_MAX+1U)) ? INT_MAX : 0 等效的值?在许多处理器上,算术右移将是这些选择中最便宜的。
  • @supercat 你真的应该问question
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 2021-07-24
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多