我正在实施一种新的浮动" NewFloat"在C中,它使用32位,它有无符号位(只有正数。 所以整个32位由指数或尾数使用。
在我的例子中,我指数为6位( EXPBITS ),尾数为26位( MANBITS )。 我们有一个用于表示负指数的偏移量,即( 2 ^(EXPBITS-1)-1 )。
给定一个NewFloat nf1,实数的转换如下: nf1 = 2 ^(指数 - 偏移)*(1 +尾数/ 2 ^ MANBITS)。
现在,给定两个NewFloats(nf1,nf2),每个都有它(exp1,man1,exp2,man2和相同的偏移量), 假设nf1> nf2 ,我可以计算nf1和nf2之和的指数和尾数,这样做是这样的:link
为了节省时间,我发现: 和的指数是:exp1 总和的尾数是:man1 + 2 ^(exp2 - exp1 + MANBITS)+ 2 ^(exp2 - exp1)* man2
为了简化代码,我分开工作并分别计算尾数的每个组成部分: x = 2 ^(exp2 - exp1 + MANBITS) y = 2 ^(exp2 - exp1)* man2
我确信我没有正确执行尾数部分:
unsigned long long x = (1 << (exp2 - exp1 + MANBITS));
unsigned long long y = ((1 << exp2) >> exp1) * man2;
unsigned long long tempMan = man1;
tempMan += x + y;
unsigned int exp = exp1; // CAN USE DIRECTLY EXP1.
unsigned int man = (unsigned int)tempMan;
总和如下所示: sum = 2 ^(exp1 - offset)*(1 +(man1 + x + y)/ 2 ^ MANBITS)。
我必须处理的最后一件事是总和的尾数溢出的情况。 在这种情况下,我应该为指数加1,除以整数(1 +(man + x + y)2 ^ MANBITS)表达式。
在这种情况下,鉴于我只需要用比特来表示提名者,我如何在分裂后做到这一点?
我的实施有问题吗?我有一种感觉。
如果你有更好的方法,我会很高兴听到它。
请不要问我为什么这样做......这是我一直试图解决的练习超过10个小时。
答案 0 :(得分:3)
代码正在进行signed int
次转换,当然需要unsigned long long
。
// unsigned long long x = (1 << (exp2 - exp1 + MANBITS));
unsigned long long x = (1LLU << (exp2 - exp1 + MANBITS));
注意:
建议更有意义的变量名称,例如x_mantissa
。
舍入未实施。舍入可能导致需要增加指数。
未检测到/已实施溢出。
未实施的子法线。如果NewFloat
不使用它们,那么a-b --> 0
并不意味着a == b
。