【发布时间】:2014-12-26 15:23:12
【问题描述】:
我在 C 中实现了一种新的浮点数“NewFloat”,它使用 32 位,它有 没有符号位(只有正数。 所以整个 32 位被指数或尾数使用。
在我的示例中,指数 (EXPBITS) 有 6 位,尾数 (MANBITS) 有 26 位。 并且我们有一个用于表示负指数的偏移量,即 (2^(EXPBITS-1)-1)。
给定一个 NewFloat nf1,转换为实数如下: nf1 = 2^(指数 - 偏移量) * (1 + 尾数/2^MANBITS)。
现在,给定两个 NewFloat(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 多个小时的练习。
【问题讨论】:
-
编写浮点套件并非易事。当库函数速度慢得令人无法接受或不存在时,我已经这样做了。如果您必须重新发明轮子,至少要使格式符合 IEEE。
-
如果你确实得到了这个“工作”,你必须测试拐角条件令人作呕以及所谓的例行任务。编写一个测试程序,循环遍历有效和无效数据的权限,并在一夜之间运行它,将结果与一个有根据的实现进行比较。
标签: c floating-point add bit addition