现在我正在看GMP,但它看起来有点过分(库必须绝对庞大,不确定我的自定义编译器是否能够处理它)并且它需要字符串形式的数字,这显然是浪费。例如:
mpz_set_str(x, "7612058254738945", 10);
mpz_set_str(y, "9263591128439081", 10);
mpz_mul(result, x, y);
这看起来很简单,我喜欢api ...但我宁愿传入数组而不是字符串。例如,如果我想将两个32位长整数相加,我希望能够传递两个大小为2的数组,其中每个数组包含两个实际上代表32位长的16位值并具有库位输出到输出数组。如果我需要浮点数,那么我也应该能够指定精度。
这可能看起来要求太多,但我要求有人见过这样的事情。
非常感谢提前!
答案 0 :(得分:2)
让我们分开答案。
这个很容易。事实上,C已经在“整数推广”这个术语下讨论了这个问题。这意味着,如果您有8位数据并且想要对它们进行操作,则只需使用 0 (或一个,如果已签名和否定)来填充它们他们16位。然后继续正常的16位操作。
注意:只要符合标准,您就不需要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的源代码,看看你是否可以挽救你需要的东西。