对浮点数进行位移

Posted

技术标签:

【中文标题】对浮点数进行位移【英文标题】:Bit shifting a floating-point 【发布时间】:2021-12-29 10:03:40 【问题描述】:

我正在做一个将任何实数转换为定点的项目。

例如下面的代码:

float ff = 8.125f;
std::cout << std::bitset<32>(ff) << std::endl; //print binary fotmat

输出:

00000000000000000000000000001000

只打印整数部分。

当我这样做时:

float ff = 8.125f;
int   va = ff * (1 << 8); //8bits shift left
    
std::cout << std::bitset<32>(va) << std::endl; //print binary fotmat

输出是:

00000000000000000000100000100000

小数部分也打印出来了。

我不明白为什么。

【问题讨论】:

这能回答你的问题吗? c++ bit shifting a float 【参考方案1】:

只打印出整数部分。

当然,因为这就是你给bitset:there is no std::bitset constructor that takes a float argument 的所有内容,所以你的ff 正在转换为unsigned long long,这将丢失小数部分(因为任何转换为将浮点类型转换为整数类型)。打开编译器警告会提醒您这一点;例如,对于您的第一个代码 sn-p,MSVC 编译器显示:

警告 C4244:“参数”:从“浮点”转换为“无符号” __int64',可能会丢失数据

在第二个示例中,您将 float 值乘以 256 并转换为整数值 2080 - 这是传递给 bitset 的值。

如果您希望在bitset 中获得float 变量的完整 位表示,您需要首先将该数据复制到unsigned long long 变量中并将其传递给构造函数:

    unsigned long long ffdata = 0;
    std::memcpy(&ffdata, &ff, sizeof(ff));
    std::cout << std::bitset<32>(ffdata) << std::endl;

输出:

01000001000000100000000000000000

【讨论】:

天哪,是的..我很愚蠢!谢谢~~~非常感谢

以上是关于对浮点数进行位移的主要内容,如果未能解决你的问题,请参考以下文章

C语言中如何对浮点数进行四舍五入?

C中的printf如何对浮点数进行舍入?

在 Matlab 中对浮点数进行位修改

fmod()函数 (对浮点数取模)

C/C++如何对浮点数取余?(如果需要的话)

基数排序浮点数