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. |
|
|