我有一个程序,它运行在两个处理器上,其中一个没有浮点支持.所以,我需要在该处理器中使用固定点执行浮点计算.为此,我将使用浮点仿真库.
我需要首先在处理器上提取浮点数的符号,尾数和指数,它们支持浮点数.所以,我的问题是如何获得单个精度浮点数的符号,尾数和指数.
按照这个图的格式,
这就是我到目前为止所做的,但除了符号,尾数和指数都不正确.我想,我错过了一些东西.
void getSME( int& s, int& m, int& e, float number )
{
unsigned int* ptr = (unsigned int*)&number;
s = *ptr >> 31;
e = *ptr & 0x7f800000;
e >>= 23;
m = *ptr & 0x007fffff;
}
Run Code Online (Sandbox Code Playgroud) 我希望能够在C++中访问数字的符号位.我当前的代码看起来像这样:
int sign bit = number >> 31;
Run Code Online (Sandbox Code Playgroud)
这似乎有效,给了我0正数和-1负数.但是,我不知道如何得到-1负数:如果是12
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 1100
Run Code Online (Sandbox Code Playgroud)
然后-12是
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0011
Run Code Online (Sandbox Code Playgroud)
将它移位31位就可以了
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001
Run Code Online (Sandbox Code Playgroud)
这是1,而不是-1,所以当我转换它时为什么我得到-1?
有没有一种简单的方法来确定浮点数的符号?
我进行了实验并想出了这个:
#include <iostream>
int main(int argc, char** argv)
{
union
{
float f;
char c[4];
};
f = -0.0f;
std::cout << (c[3] & 0x10000000) << "\n";
std::cin.ignore();
std::cin.get();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中(c [3]&0x10000000)为负数给出的值> 0但我认为这要求我做出以下假设:
如果任何这些假设错误或者我错过了任何假设,请纠正我.