我正在尝试将数字转换为负四进制基数(作为生成复数的Quater虚数基数的步骤)。但是我似乎无法把小数点放在脑后。 我该如何实施? (使用java / javascrtip / C#/ C / C ++ / python / ruby或任何其他类似的编程语言)? https://en.wikipedia.org/wiki/Negative_base#To_any_negative_base有用于整数的代码示例,我大部分都理解这一点,但是我无法使其用于小数点:(
有人可以帮忙吗?
答案 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
为奇数,则可能需要截断或四舍五入最后一位以获得所需的位数。