【问题标题】:Looking for Ansi C89 arbitrary precision math library寻找 Ansi C89 任意精度数学库
【发布时间】:2013-07-23 06:41:06
【问题描述】:

几年前,我为朋友定制的 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 位 long 相乘,我希望能够将两个大小为 2 的数组传递给它,其中每个数组包含两个 16 位值,它们实际上代表一个 32 位 long 并具有库位置输出到输出数组。如果我需要浮点,那么我也应该能够指定精度。

这似乎要求太多了,但我是希望有人看到这样的东西。

非常感谢!

【问题讨论】:

  • 我只能给你一个提示。前段时间我还为自己的 32 位操作系统实现了 64 位变体。我发现 gcc 编译器的源代码特别是 libgcc 库非常有用,因为它包含用于实现更长的数学函数的 c 源代码。

标签: c arbitrary-precision


【解决方案1】:

让我们分开答案。

8 位算术

这个很简单。事实上,C 已经在“整数提升”一词下谈到了这一点。这意味着如果你有 8 位数据并且你想对它们进行操作,你只需用 zero 填充它们(或者如果有符号和负数则为 one)以使它们是 16 位的。然后继续正常的 16 位操作。

32 位算术

注意:只要符合标准,您实际上并不需要 32 位整数。

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

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

浮点运算

注意:只要是标准,你并不需要符合 IEEE 754。

已经为软件模拟浮点编写了各种库。你可能会觉得这个gcc wiki page 很有趣:

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

使用 EEMBC 进行的性能测量表明,在 IBM PowerPC 405 和440. 这些是 EEMBC 的几何平均测量值;如果某些测试大量使用浮点,则使用 soft-fp 比使用 fp-bit 快几倍,而其他测试则没有大量使用浮点。根据特定的测试,soft-fp 或 ieeelib 可能更快;例如,soft-fp 在 Whetstone 上要快一些。

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

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    相关资源
    最近更新 更多