crypt of decay - May 27th, 2017 [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

May 27th, 2017

sorting floats with CPU [May. 27th, 2017|03:51 pm]
вам трючок из арсенала гейдевов:

uint encodeSortableFloat (in float v) pure nothrow @trusted @nogc {
  pragma(inline, true);
  immutable uint res = *cast(const(uint)*)&v;
  // reverse sequence of negative numbers, or flip sign for positive numbers
  return (res&0x80000000U ? ~res : res|0x80000000);
}

ща поясню: когда надо отсортировать большой массив флоатов, пинать FPU на каждое сравнение весьма затратно. беда же в том, что IEEE формат нихера не сортируется как integers, чтобы это делать на CPU. но. поскольку нас интересует только соотношение «больше‐меньше‐равно», то можно преобразовать IEEE во что‐то, что нормально сортируется как обычное целое. вот таким вот образом, как написано выше.

для дотошных: отрицательный ноль получается на единичку меньше положительного нуля, что и правильно, и абсолютно не имеет значения. понятно, что предполагаются нормализованые плавающие — автоматическая правда для IEEE float и IEEE double.
Link13 meows|meow!

navigation
[ viewing | May 27th, 2017 ]
[ go | Previous Day|Next Day ]