【发布时间】:2013-03-19 02:07:11
【问题描述】:
我有一个程序,它在两个处理器上运行,其中一个不支持浮点。因此,我需要在该处理器中使用定点执行浮点计算。为此,我将使用浮点仿真库。
我需要首先在支持浮点的处理器上提取浮点数的符号、尾数和指数。所以,我的问题是如何获得单精度浮点数的符号、尾数和指数。
按照该图的格式,
这就是我到目前为止所做的,但除了符号,尾数和指数都不正确。我想,我错过了一些东西。
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;
}
【问题讨论】:
-
尝试从这里开始:en.wikipedia.org/wiki/Single-precision_floating-point_format,但我几乎可以肯定你看到了这个
-
C 标准不支持通过指针转换产生别名,在某些编译器中可能会很麻烦。最好使用
(union { float f; uint32_t u; }) { number } .u。这将返回一个uint32_t,它是floatnumber的字节,被重新解释为 32 位无符号整数。 -
我假设 IEEE 754 32 位二进制。您是否意识到以下问题? (1) 指数有偏差,实际指数加 127。 (2) 除了非常小的浮点数之外的所有浮点数都被归一化,并且一个归一化的浮点尾数的前1位不被存储。
-
你是指C还是C++(C没有引用,只有指针)
-
三个问题: 0. 没有从编码指数中去除偏差 1. 没有为正常的非零数添加隐式尾数位 2. 没有处理非正规数、无穷大和 sNaN/qNaNs
标签: c floating-point emulation