В своем проекте (С++, GUI на C#) понадобилось работать с разными системами счисления (2,6,10,16 и не только). Причем выполнять математические операции над ними (сложение, вычитание, умножение, деление). Работать надо как с натуральными, так и с вещественными числами. И в идеале получать на выходе и целую и дробную части в виде, например, строки — для показа пользователям.
Необходима возможность вызова функции, к примеру, сложения с двумя аргументами: 1 — натуральное число в десятичной системе (2300), 2 — вещественное число в троичной системе («2120.102»)
Существуют ли такие библиотеки (на С++ или на C#), которые могли бы предоставить сей функционал?
Если таких нет, не лучше было бы воплотить в жизнь на каком-нибудь функциональном языке (хотя скорее всего уже есть) и связать с С++ или C#?
А вы точно понимаете что вам нужно? Зачем хранить и выполнять вычисления а разных системах счисления? Всё же всё-равно в двоичную превращается. Или есть какой-то профит именно от заданных систем счисления? Если это учебная работа то советую написать руками.
Оперировать я буду, естесственно, одним числом и не собираюсь хранить числа в разных системах (просто бессмысленно). А вопрос собственно был, есть ли библиотеки с уже реализованной функциональностью по проведении мат. операций. Ну, то есть, как я вижу вызов, например, функции сложения в найденной библиотеке: первый аргумент — строка с вещественным n1-арным числом («222010.222» — троичная), второй аргумент — строка с вещественным n2-арным числом («424010.2401» — 5-ричная), третий — тип результирующей системы счисления — m-арная система счисления (16-ричная), и на выходе я хочу получить суммирующую строку именно в формате m-арной системы («FF3.44D»).
Т.е. вы ожидаете увидеть примерно такой заголовок:
string Add_3base_to_5_base_ret_16_base(string base_3, string base_5);
? Это ж сколько функций должно быть объявлено в такой библиотеке? Да и зачем?
Если так, то зря ждете, потому как все решается другим способом:
to_base( from_base(base3, 3) + from_base(base5, 5), 16);
Функции по конвертированию найти не проблема. Да и неужели проблема — написать две функции конвертирования, и, если необходимо — один класс с 4мя перегруженными операторами и необходимыми обертками над мат операциями?
Да, я имел в виду именно тот формат, что написали вы — просто торопился с ответом…
По поводу того, что проблема — нет, не проблема. Наверное вопрос яйца выеденного не стоит…
Зачем вообще оперировать с числом в странной системе счисления? Храните в одной, в двоичной как обычно, приводите к ней, в ней считайте и потом выводите как надо.
Выше, я уже ответил, что именно так и предполагал делать, вся суть вопроса сводится к вопросу, а есть ли готовый код (функции) для конвертирования, проведения мат. операций с учетом вещественных чисел.
И да, алгоритмы конвертации мне известны.
Ещё раз. Конвертация есть. Операции то зачем? Операции идут обычным образом с обычным двоичным представлением в железе, результат отображаем как хотим. Для целых есть itoa Для вещественных не знаю.
Вы смешиваете логику с отображением. (А это один из величайших грехов в программировании)
Не бывает чисел в десятичной системе или в троичной системе — числа, это числа. Бывает десятичная система ЗАПИСИ чисел. (Т.е. речь об отображении).
Если грамотно разделить, то у вас останутся — конвертеры из строковой записи в числовую и обратно, и обычные математические функции.
Например: создайте класс Number, добавьте в него функции:
Number(<число_записанное_строкой>, <разрядность>)
__toString(<разрядность>)
И перегруженные операторы сложения, вычитания, деления.
Я просто неполно сформулировал вопрос. Логика и отображение у меня никоим образом не смешиваются. Выше я дополнил вопрос. Я понимаю, что все промежуточные операции будут вида: из строки с X-нарной системы в 10-ную (ну по сути двоичная, но не будем углубляться), затем проведение операций, затем вывод в строковом формате в Y-арную.
пару лет назад развлекался подобной штукой (написал себе калькулятор), но классы пришлось писать самому: не нагуглил ничего похожего.
Правда, я хранил всё в виде массивов (и порядок, и мантиссу, и основание СС) и действия над ними выполнял программно. Это явно было очень медленно. Зато иллюстрировало работу с различными основаниями системам счисления.