Конвертировать float в int64_t при сохранении порядка - PullRequest
1 голос
/ 04 марта 2020

Мой вопрос похож на этот вопрос , который касается положительных значений с плавающей запятой.

В моем случае я имею дело как с положительными, так и с отрицательными значениями float, и хочу сохранить их в типе int64_t.

ПРИМЕЧАНИЕ: я sh используйте memcpy вместо того, чтобы полагаться на объединение (которое является UB в C ++).

1 Ответ

2 голосов
/ 04 марта 2020

Как описано в моем комментарии к связанному вопросу о 32-битном варианте:

... в основном вы можете использовать int32 со знаком и инвертировать младшие 31 бит, если бит знака набор. Аналогичный подход работает, если вы хотите беззнаковый, но вы должны добавить смещение 0x80000000.

Как код, адаптированный к 64-битному:

int64_t order_preserving_repr(double x)
{
    int64_t k;
    memcpy(&k, &x, sizeof k);
    if (k<0) k ^= INT64_MAX;
    return k;
}
...