将尾数作为位返回

时间:2013-05-17 16:53:50

标签: c floating-point mantissa

我的c代码有点麻烦。我试图提取符号,指数和尾数。到目前为止,它已经成功用于符号和指数。问题始于尾数。 例如,我们选择 -5.0 。符号 1 位,指数 8 位,尾数 23 位。 这是 -5.0

的二进制表示法

1 10000001 01000000000000000000000

1 =签名

10000001 =指数

01000000000000000000000 =尾数。

我想把尾数的位回来。

static int fpmanitssa(uint32_t number) {

   uint32_t numbTemp = 8388607;
   number = number & numbTemp;  //bitwise AND, number should be 2097152.

   int numbDiv;
   int leftover;
   char resultString[23];
   size_t idx = 0;

   do {
       numbDiv = number/2;
       leftover = number % 2;
       resultString[idx++] = leftover;
       number = numbDiv;
   } while (number != 0);

 return resultString;

我得到的结果是负数。我不知道为什么它不起作用。你能帮忙找到问题吗?

问候 萩

3 个答案:

答案 0 :(得分:1)

1)浮点数具有有效数(具有线性标度,也称为分数部分),而不是尾数(具有对数标度)。

2)声明您的函数返回int,但您尝试返回resultString,这是char的数组。 char数组不是int,无法自动转换为int

3)如果你确实返回resultString,它将失败,因为resultString的生命周期只是函数执行期间的时间;函数返回后不能使用它。如果你打算从函数中返回字符,则应声明它以便调用者传入适当大小的现有数组,或者函数动态分配数组(与malloc一样)并将其地址返回给调用者谁负责最终解除分配(用free)。

4)如果要返回带有编码有效位的位的int,并且number包含编码的浮点数和低位的编码有效位数,那么你只有要做的是用AND运算去掉高位并返回低位。

5)如果char数组要形成一个可打印的数字而不是数字位,那么应该为每个数字添加'0',将它从整数0或1转换为字符“0”或“1”。在这种情况下,您可能还需要resultString末尾的空字符。

6)这些位按从低位到高位的顺序分配给resultString,如果稍后要打印resultString,则可能与所需的顺序相反。 (如果resultString仅用于计算而不是打印,则订单可能没有问题。)

7)以上假定您只想返回编码的有效数,这是浮点编码中的显式位。如果要返回表示的有效数,包括隐含位,则需要24 th 位置,如果指数非零则为1,否则为0。 (当然,假设这个数字不是NaN或无穷大。)

答案 1 :(得分:0)

首先,你的函数声明指定你返回一个int,但是你返回resultString,它是一个char *。我认为你可能依赖于自动类型转换而不是C的一部分。要使resultString看起来像你想要的那样,你需要向剩余部分添加0x30(0x30为'0',0x31为'1')。 / p>

然后你需要null终止字符串并使用atoi()将其转换回int。

以下内容可能与您的预期不完全相同,但包含处理ascii / integer转换的更改:

static int fpmanitssa(uint32_t number) {

   uint32_t numbTemp = 8388607;
   number = number & numbTemp;  //bitwise AND, number should be 2097152.

   int numbDiv;
   int leftover;
   char resultString[24] = {0};
   size_t idx = 0;

   do {
       numbDiv = number/2;
       leftover = number % 2;
       resultString[idx++] = leftover + 0x30;
       number = numbDiv;
   } while (number != 0);

 return atoi(resultString);
}

答案 2 :(得分:0)

如果您碰巧使用uClibc或glibc,可以使用ieee754.hmantissa字段,如此

#include <ieee754.h>

static unsigned int fpmanitssa(float number)
{
        ieee754_float x = {.f = number};
        return x.mantissa;
}