寻找安西C89任意精度数学库

时间:2013-07-23 06:41:07

标签: c arbitrary-precision

几年前,我为朋友的自定义16位堆栈CPU编写了一个Ansi C编译器,但我从来没有实现所有数据类型。现在我想完成这项工作,所以我想知道是否有任何数学库可供我填补空白。我可以处理16位整数数据类型,因为它们是CPU的原生数据,因此我为它们完成了所有的数学例程(即。+, - ,*,/,%)。但是,由于他的CPU不处理浮点数,所以我必须自己实现浮点数/双精度数。我还必须实现8位和32位数据类型(烦恼整数和浮点数/双精度数)。我很确定这已经完成并且多次重做,因为我不是特别期待重新创建轮子,如果有人能指出我可以帮助我的图书馆,我会很感激。

现在我正在看GMP,但它看起来有点过分(库必须绝对庞大,不确定我的自定义编译器是否能够处理它)并且它需要字符串形式的数字,这显然是浪费。例如:

mpz_set_str(x, "7612058254738945", 10);
mpz_set_str(y, "9263591128439081", 10);
mpz_mul(result, x, y);

这看起来很简单,我喜欢api ...但我宁愿传入数组而不是字符串。例如,如果我想将两个32位长整数相加,我希望能够传递两个大小为2的数组,其中每个数组包含两个实际上代表32位长的16位值并具有库位输出到输出数组。如果我需要浮点数,那么我也应该能够指定精度。

这可能看起来要求太多,但我要求有人见过这样的事情。

非常感谢提前!

1 个答案:

答案 0 :(得分:2)

让我们分开答案。

8位算术

这个很容易。事实上,C已经在“整数推广”这个术语下讨论了这个问题。这意味着,如果您有8位数据并且想要对它们进行操作,则只需使用 0 (或一个,如果已签名和否定)来填充它们他们16位。然后继续正常的16位操作。

32位算术

注意:只要符合标准,您就不需要32位整数。

这可能有点棘手,但仍然不值得使用库。对于每个操作,你需要看一下你在小学10年级学习如何学习它们,然后在基数2 16 中做同样的2位数字(每个数字为1) 16位整数)。一旦你理解了简单的基数10数学(以及算法)的类比,你就需要在CPU的汇编中实现它们。

这基本上意味着在一个寄存器上加载最高有效16位,在另一个寄存器中加载最低有效位。然后按照每个操作的算法进行操作。你很可能需要从溢出和其他标志中获得帮助。

浮点运算

注意:只要符合标准,您就不需要符合IEEE 754。

已经为软件模拟浮点编写了各种库。您可能会发现此gcc wiki page有趣:

  

GNU libc有第三个实现,soft-fp。 (其中的变体也用于某些目标上的Linux内核数学仿真。)soft-fp用于PowerPC上的glibc --without-fp,以提供与libgcc相同的软浮点函数。它也用于Alpha,SPARC和PowerPC,以提供一些ABI指定的浮点函数(反过来可能被GCC使用);在PowerPC上,这些是IEEE四元函数,而不是IBM长双函数。

     

使用EEMBC进行的性能测量表明,soft-fp(有点使用来自ieeelib的想法加速)比fp-bit和ieeelib快约10-15%,比soft-fp快约1%,在IBM PowerPC 405上进行测试440.这些是EEMBC的几何平均测量值;如果使用soft-fp,使用soft-fp比使用fp-bit更快一些测试,如果他们大量使用浮点,而其他测试则没有大量使用浮点。根据具体测试,soft-fp或ieeelib可能更快;例如,在Whetstone上,soft-fp稍快一些。

一个答案可能是看看glibc的源代码,看看你是否可以挽救你需要的东西。