如何将浮点数转换为负四进制底数(以-4为底?)

时间:2018-12-18 14:20:28

标签: math base complex-numbers

我正在尝试将数字转换为负四进制基数(作为生成复数的Quater虚数基数的步骤)。但是我似乎无法把小数点放在脑后。 我该如何实施? (使用java / javascrtip / C#/ C / C ++ / python / ruby​​或任何其他类似的编程语言)? https://en.wikipedia.org/wiki/Negative_base#To_any_negative_base有用于整数的代码示例,我大部分都理解这一点,但是我无法使其用于小数点:(

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

通过更多的谷歌搜索,我设法在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

答案 1 :(得分:0)

由于您没有显示自己的代码,因此我只介绍一种没有代码的算法。

我的基本想法是将给定数字乘以基数的幂,使我们感兴趣的数字位于该点的左侧。然后,我们将数字四舍五入到最接近的整数。然后,使用您已经具有的代码来获得负四元或类似表示形式的字符串。最后,将点插入字符串中的适当位置,这实际上会分配基数的幂。如果需要,请四舍五入最后一位数字。

第一步是将基数的 even 乘以。负基表示表示如果将底数为-4的负四元数乘以(-4)^2,即16,则其负四元数表示将与原始号码。唯一的区别是该点已移动了两个空格。因此,如果您希望答案的数字为prec,则将prec向上舍入为偶数(如果prec为偶数,则将其本身舍入,如果为奇数,则prec+1)。然后,将您给定的数字乘以(-4)^roundedprec。如果prec为奇数,则可能需要截断或四舍五入最后一位以获得所需的位数。