Я пытаюсь преобразовать число в отрицательную четвертичную основу (как шаг в создании четвертичной мнимой базы для комплексного числа). Но я не могу понять, что делать с десятичными знаками. Как мне это реализовать? (используя java / javascrtip / C# / C / C++ / python / ruby или любой другой аналогичный язык программирования)? https://en.wikipedia.org/wiki/Negative_base#To_any_negative_base имеет образцы кода для целого числа, и я в основном это понимаю, но мне не удается заставить его работать с десятичными знаками :(
Кто-нибудь может помочь?





Немного погуглив, мне удалось найти этот фрагмент кода на Python, который делает свое дело!
https://math.stackexchange.com/a/2120385/514618
Код Python из этого обсуждения
from math import floor
def to_nb(num, base, prec=-15):
"converts a real from base 10 to negative base (base < -1)"
digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
newval = ""
if base >= -1 or base < -len(digits):
raise ValueError('invalid base')
P = 0; base = abs(base) # ref. defines method for -base where base > 0
lb, rb, X = -base / (base+1.), 1 / (base+1.), num
while not lb <= X < rb:
P += 1
X = num / (-base) ** P
def T(x): return -base * x - floor( -base * x - lb)
while P >= prec: # conversion step
d = int(floor(-base*X - lb))
X = T(X)
if P == 0 and '.' not in newval: # add radix point
newval = newval + '.'
if d == base: # if this happens, you do this (see Ito ref.)
newval = newval + digits[d-1]+ digits[0]
else:
newval = newval + digits[d]
P -= 1
return newval
Поскольку вы не показываете собственного кода, я просто представлю алгоритм без кода.
Моя основная идея состоит в том, чтобы умножить данное число на степень основания, чтобы сделать интересующие нас цифры слева от точки. Затем мы округляем число до ближайшего целого числа. Затем используйте код, который у вас уже есть, чтобы получить отрицательное четвертичное или подобное представление в виде строки. Наконец, вставьте острие в нужное место в струне, что, по сути, делит мощность базы. При необходимости округлите последнюю цифру.
Первым шагом является умножение на степень четное основания. Представление с отрицательной базой означает, что если мы умножим отрицательно-четвертичное число, имеющее основание -4, на (-4)^2, а именно 16, его отрицательно-четвертичное представление будет иметь те же цифры, что и исходное число. Единственная разница в том, что точка была перемещена на два деления. Поэтому, если вы хотите, чтобы в вашем ответе было количество цифр prec, округлите prec до четного числа (само, если prec четное, и prec+1, если оно нечетное). Затем умножьте полученное число на (-4)^roundedprec. Если prec был нечетным, вы можете усечь или округлить последнюю цифру, чтобы получить желаемое количество цифр.
Думайте о числе как о сумме степеней основания, умноженных на соответствующие им коэффициенты (цифры). Дробный компонент соответствует сумме по отрицательные силы основания. Арифметика по модулю все еще может использоваться, но вам может потребоваться явно кодировать операции вместо использования
%(или использоватьfmodв C).