boost :: dynamic_bitset <>奇怪的行为

时间:2020-08-03 14:34:56

标签: c++ boost

我正在尝试用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

我希望二进制表示形式为10,即00000000000000001010。

2 个答案:

答案 0 :(得分:1)

我使用此tool来计算10.0f的真实位表示形式,即01000001001000000000000000000000

您的代码执行的操作将返回您看到的00000000000000000000的后20位。

现在,我想解释一下如何修正您的代码,但是我不确定自己到底想做什么。如果您能解释,我会尽力建议正确的方法。

答案 1 :(得分:1)

[已解决]永远不会遵循客户的要求而没有思考-无法用20/22位(例如10.0 dec)编码所有浮点数。谢谢@约翰。