Ищу математическую библиотеку произвольной точности Ansi C89

Несколько лет назад я написал компилятор Ansi C для пользовательского 16-разрядного процессора на основе стека моего друга, но так и не удосужился реализовать все типы данных. Теперь я хотел бы закончить работу, поэтому мне интересно, есть ли какие-нибудь математические библиотеки, которые я могу использовать, чтобы заполнить пробелы. Я могу работать с 16-битными целочисленными типами данных, поскольку они встроены в ЦП, и поэтому я выполняю для них все математические процедуры (т.е. +, -, *, /, %). Однако, поскольку его ЦП не обрабатывает числа с плавающей запятой, мне приходится самому реализовывать числа с плавающей запятой/двойники. Я также должен реализовать 8-битные и 32-битные типы данных (целые числа и числа с плавающей запятой/двойные числа). Я почти уверен, что это было сделано и переделано много раз, и, поскольку я не особенно жду воссоздания колеса, я был бы признателен, если бы кто-нибудь указал мне на библиотеку, которая может мне помочь.

Теперь я смотрел на GMP, но это кажется излишним (библиотека должна быть абсолютно огромной, не уверен, что мой собственный компилятор сможет с ней справиться), и он принимает числа в виде строк, которые были бы расточительны по очевидным причинам. Например :

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

Это кажется достаточно простым, мне нравится API... но я бы предпочел передать массив, а не строку. Например, если бы я хотел умножить два 32-битных длинных числа вместе, я хотел бы иметь возможность передать ему два массива размера два, где каждый массив содержит два 16-битных значения, которые фактически представляют 32-битное длинное и имеют библиотечное место вывод в выходной массив. Если мне нужна плавающая запятая, я также должен указать точность.

Может показаться, что я прошу слишком многого, но я прошу в надежде, что кто-то видел что-то подобное.

Спасибо заранее!


person Anthony    schedule 23.07.2013    source источник
comment
Я могу только дать вам подсказку. Некоторое время назад я также внедрил 64-битные варианты для своей 32-битной операционной системы. Я нашел исходный код компилятора gcc, особенно библиотеку libgcc, очень полезным, поскольку он содержит исходный код c для реализации более длинных математических функций.   -  person bkausbk    schedule 23.07.2013


Ответы (1)


Разделим ответ.

8-битная арифметика

Это очень легко. На самом деле, C уже говорит об этом под термином целочисленное продвижение. Это означает, что если у вас есть 8-битные данные и вы хотите выполнить над ними операцию, вы просто дополняете их нулем (или единицей, если знак отрицательный), чтобы сделать они 16-битные. Затем вы переходите к обычной 16-битной операции.

32-битная арифметика

Примечание. Что касается стандарта, вам не обязательно иметь 32-битные целые числа.

Это может быть немного сложно, но для этого все же не стоит использовать библиотеку. Для каждой операции вам нужно посмотреть, как вы научились выполнять их в начальной школе по основанию 10, а затем сделать то же самое по основанию 216 для двухзначных чисел (каждая цифра равна единице). 16-битное целое число). Как только вы поймете аналогию с простой математикой с основанием 10 (и, следовательно, с алгоритмами), вам нужно будет реализовать их в сборке вашего ЦП.

В основном это означает загрузку старших 16 бит в один регистр и наименее значимых в другой регистр. Затем следуйте алгоритму каждой операции и выполняйте ее. Скорее всего, вам понадобится помощь от переполнения и других флагов.

Арифметика с плавающей запятой

Примечание: если речь идет о стандарте, вам не обязательно соответствовать IEEE 754.

Существуют различные библиотеки, уже написанные для программной эмуляции операций с плавающей запятой. Эта вики-страница gcc может показаться вам интересной:

GNU libc имеет третью реализацию, soft-fp. (Варианты этого также используются для математической эмуляции ядра Linux на некоторых целевых устройствах.) soft-fp используется в glibc на PowerPC --without-fp для обеспечения тех же функций soft-float, что и в libgcc. Он также используется в Alpha, SPARC и PowerPC для предоставления некоторых функций с плавающей запятой, определенных ABI (которые, в свою очередь, могут использоваться GCC); на PowerPC это четырехъядерные функции IEEE, а не длинные двойные функции IBM.

Измерения производительности с помощью EEMBC показывают, что soft-fp (с некоторым ускорением с использованием идей ieeelib) примерно на 10-15% быстрее, чем fp-bit, а ieeelib примерно на 1% быстрее, чем soft-fp, при тестировании на IBM PowerPC 405 и 440. Эти средние геометрические измерения по EEMBC; некоторые тесты выполняются в несколько раз быстрее с soft-fp, чем с fp-bit, если они интенсивно используют плавающую запятую, в то время как другие не используют значительного использования плавающей запятой. В зависимости от конкретного теста, либо soft-fp, либо ieeelib могут быть быстрее; например, soft-fp несколько быстрее на Whetstone.

Один из ответов может заключаться в том, чтобы взглянуть на исходный код glibc и посмотреть, сможете ли вы спасти то, что вам нужно.

person Shahbaz    schedule 23.07.2013