指数可以存储为浮点数吗?

时间:2017-10-21 11:13:57

标签: binary floating-point

我想知道二进制指数是否可以以浮点形式存储。这是我的意思的一个例子:

在系统浮点数中,使用10-bit two's complement mantissa6-bit floating point exponent

0101001000 000100转换为denary:

如果我假设指数是正常的二进制,则指数等于4

所以尾数中的小数点最初在这里:

0.101001000

然后我们将小数点向右移动4个位置,产生

01010.01 

在等号中等于10.25

如果指数可以像小数一样存储,那么这个答案就会大不相同。我问的是指数是否可以这种方式存储。

1 个答案:

答案 0 :(得分:0)

  

如果二进制指数可以以浮点形式存储

是。
要从字符串中形成 denary ,请使用strtol()

要将 denary 转换为浮点数,请将这些位提取到其“尾数”和指数中。使用ldexp()形成FP值。

double ldexp(double x, int exp);
  

ldexp函数将浮点数乘以2的整数幂   c11dr§7.12.6.72

#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>

#define denary_MANIISSA_EXPO 9
#define denary_MANIISSA_MASK 0xFFC0u
#define denary_EXPO_SCALE 64

double denary_to_double(denary d) {
  int expo = d & (denary_EXPO_SCALE - 1);
  int mantissa = (d - expo) / denary_EXPO_SCALE;
  return ldexp(mantissa, expo - denary_MANIISSA_EXPO);
}

void denary_test(const char *s) {
  denary d = (denary) strtol(s, NULL, 2);
  printf("0x%04X -->", d & 0xFFFF);
  printf(" %+.9f\n", denary_to_double(d));
}
int main(void) {
  denary_test("0101001000" "000100");
  denary_test("0000000000" "000000"); // zero
  denary_test("0000000001" "000000"); // denary_POS_MIN
  denary_test("1111111111" "000000"); // denary_NEG_MIN
  denary_test("0111111111" "111111"); // denary_POS_MAX
  denary_test("1000000000" "111111"); // denary_NEG_MAX
}

输出

0x5204 --> +10.250000000
0x0000 --> +0.000000000
0x0040 --> +0.001953125
0xFFC0 --> -0.001953125
0x7FFF --> +9205357638345293824.000000000
0x803F --> -9223372036854775808.000000000