我想知道二进制指数是否可以以浮点形式存储。这是我的意思的一个例子:
在系统浮点数中,使用10-bit two's complement mantissa
和6-bit floating point exponent
将0101001000 000100
转换为denary:
如果我假设指数是正常的二进制,则指数等于4
所以尾数中的小数点最初在这里:
0.101001000
然后我们将小数点向右移动4个位置,产生
01010.01
在等号中等于10.25
。
如果指数可以像小数一样存储,那么这个答案就会大不相同。我问的是指数是否可以这种方式存储。
答案 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