boost :: dynamic_bitset <> странное поведение - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь закодировать долготу / широту с помощью 22 бит и радиус с 20 битами, но с радиусом есть что-то странное - см. Вывод ниже, пожалуйста ...

#include <iostream>
#include <cassert>
#include <boost/dynamic_bitset/dynamic_bitset.hpp>
using namespace std;
 
boost::dynamic_bitset<> f2b(int n, float f) {
    assert(sizeof(float) == sizeof(int));
    union {
        float input;
        int output;
    } data;
 
    data.input = f;
    boost::dynamic_bitset<> bits(n, data.output);
                                                                                                               
    return bits;
}
 
int main() {
    // latitude
    cout << f2b(22, (-89.9 + 90) / 180) << '\n';
    // longitude
    cout << f2b(22, (-179.9 + 180) / 360) << '\n';
    // radius
    cout << f2b(20, 10.0) << '\n'; // why this returns '00000000000000000000' ?
 
    return 0;
}

$ ./bits 
0100011010001010110100
0100011010001010110100
00000000000000000000

i ' d ожидает двоичного представления 10, которое равно 00000000000000001010.

Ответы [ 2 ]

1 голос
/ 03 августа 2020

[РЕШЕНО] никогда не следуйте спецификациям клиента без размышлений - невозможно закодировать все числа с плавающей запятой 20/22 битами (например, 10.0 de c). спасибо @ john.

1 голос
/ 03 августа 2020

Я использовал этот инструмент для вычисления истинного битового представления 10.0f, это 01000001001000000000000000000000.

Что ваш код делает, он возвращает нижние 20 бит того, что является 00000000000000000000, что вы видите.

Теперь я хотел бы объяснить, как исправить ваш код, но я не совсем уверен, что вы пытаетесь сделать. Если вы можете объяснить, я сделаю все возможное, чтобы предложить правильный способ сделать это.

...