c - 将尾数作为位返回

标签 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;

我得到的结果是负数。我不知道为什么它不起作用。能否请您帮忙找出问题所在?

问候 萩市

最佳答案

1) float 有尾数(线性刻度,也叫小数部分),没有尾数(对数刻度)。

2) 您的函数被声明为返回一个int,但您试图返回resultString,它是一个char 数组。 char 数组不是 int,无法自动转换为 int

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

4) 如果你想返回一个 int 带有编码有效位的位,并且 number 包含编码有效位在低位的编码 float 位,那么您所要做的就是使用 AND 运算移除高位并返回低位。

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

6) resultString 的位按照从低位到高位的顺序分配,如果 resultString 打算稍后打印,这可能与期望的顺序相反. (如果 resultString 只用于计算而不是打印,顺序可能没问题。)

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

关于c - 将尾数作为位返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16614283/

相关文章:

c++ - 如何计算尾数位数?

C程序内存映射

c - 如何将 OpenMP 指令 (#pragmas) 包装为函数或类似函数的宏?

c - 从 C 函数返回字符串

c - c中的堆栈内存布局

c++ - 对于 BTreeMap 和其他依赖 Ord 的事物,是否有等效于 C++ 比较器对象的对象?

c++ - 编译器将浮点型变量转换为整型变量时会做什么?

C 编码,比较浮点值时的意外行为

objective-c - NSDecimalNumber 的小数部分

python-2.7 - 如何使用 matplotlib 颜色条中的偏移表示法更改尾数的位数