簡體   English   中英

尋找安西C89任意精度數學庫

[英]Looking for Ansi C89 arbitrary precision math library

幾年前我為朋友的自定義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位值並具有庫位輸出到輸出數組。 如果我需要浮點數,那么我也應該能夠指定精度。

這可能看起來要求太多,但我要求有人見過這樣的東西。

提前謝謝了!

讓我們分開答案。

8位算術

這個很容易。 事實上,C已經在“整數推廣”這個術語下討論過這個問題。 這意味着,如果你有8位數據,你想用做對他們的操作,您只需墊它們(如果簽署或一個和負面的),使他們16位。 然后繼續正常的16位操作。

32位算術

注意:只要涉及標准,您實際上不需要具有32位整數。

這可能有點棘手,但仍然不值得使用庫。 對於每個操作,您需要看一下您在小學10年級中如何學習它們,然后在基數2 16中對2位數字(每個數字是一個16位整數)進行相同操作。 一旦你理解了簡單的基數10數學(以及算法)的類比,你就需要在CPU的匯編中實現它們。

這基本上意味着在一個寄存器上加載最高有效16位,在另一個寄存器中加載最低有效位。 然后按照每個操作的算法進行操作。 您很可能需要從溢出和其他標志獲得幫助。

浮點運算

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

已經為軟件模擬浮點編寫了各種庫。 你可能會發現這個gcc wiki頁面很有趣:

GNU libc有第三個實現,soft-fp。 (其中的變體也用於某些目標上的Linux內核數學仿真。)soft-fp用於PowerPC上的glibc --without-fp,以提供與libgcc相同的軟浮點函數。 它也用於Alpha,SPARC和PowerPC,以提供一些ABI指定的浮點函數(反過來可能被GCC使用); 在PowerPC上,這些是IEEE四核功能,而不是IBM長雙功能。

使用EEMBC進行的性能測量表明,在IBM PowerPC 405和440上進行測試時,soft-fp(有點使用來自ieeelib的想法加速)比fp-bit和ieeelib快約10-15%,比soft-fp快約1%。是EEMBC的幾何平均測量值; 一些測試使用soft-fp比使用fp-bit快幾倍,如果他們大量使用浮點,而其他測試沒有大量使用浮點。 根據具體測試,soft-fp或ieeelib可能更快; 例如,soft-fp在Whetstone上有點快。

一個答案可能是看看glibc的源代碼,看看你是否可以挽救你需要的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM