自定义浮点数加法,实现数学表达式 - C



我正在用C实现一种新的浮点"NewFloat",它使用32位,它没有符号位(只有正数。所以整个 32 位由指数或尾数使用。

在我的例子中,我有 6 位用于指数 (EXPBITS),26 位用于尾数 (MANBITS)。我们有一个用于表示负指数的偏移量,即 (2^(EXPBITS-1)-1)。

给定一个 NewFloat nf1,转换为实数是这样的:nf1 = 2^(指数 - 偏移量) * (1 + mantissa/2^MANBITS).

现在,给定两个 NewFloat (nf1, nf2),每个都有它的 (exp1, man1, exp2, man2 和相同的偏移量),假设 nf1> nf2,我可以计算 nf1 和 nf2 之和的指数和尾数,这是这样完成的:

链接

为了节省您的时间,我发现:总和的指数为: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多个小时的练习。

代码正在做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.

最新更新