鸽子的浮点运算
挺有意思的一道题,需要模拟16位的浮点运算,只需要计算32位浮点就行
然后unsigned int p = (unsigned int)&f;输出二进制位
// 0 10000001 11101000000000000000000 31 30 23 22
// 0 10001 1110100000 15 14 10 9
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
float pre(float f) {
unsigned int *p = (unsigned int*)&f;
unsigned int x = *p;
for (int i = 0; i < 13; ++i) {
if (((x>>i)&1) == 1) {
x ^= (1<<i);
}
}
float *tg = (float*)&x;
return *tg;
}
int main() {
// freopen("D:\\shuru.txt", "r", stdin);
int n, op;
float f1, f2, f3;
scanf("%d", &n);
while (n--) {
scanf("%d%f%f", &op, &f1, &f2);
f1 = pre(f1);
f2 = pre(f2);
if (op == 1) {
f3 = f1;
}
else if (op == 2) {
f3 = f1 + f2;
}
else if (op == 3) {
f3 = f1 * f2;
}
unsigned int *p = (unsigned int*)&f3;
unsigned int x = *p;
cout << ((x>>31)&1) << ((x>>30)&1);
for (int i = 26; i >= 23; --i) {
cout << ((x>>i)&1);
}
for (int i = 22; i >= 13; --i) {
cout << ((x>>i)&1);
}
cout << endl;
}
return 0;
}