sta*_*oob 8 r decimal base-conversion
最近,我读到古巴比伦文明使用以 60 为基数而不是 10 为基数的数字系统。即使使用以 60 为基数的数字系统,他们仍然能够近似计算 2 \xe2\x80\x94 的平方根,并且几千年前也是如此!
\n\n我对此很好奇,想看看如何将十进制(以 10 为基数)中的数字转换为六十进制(以 60 为基数)。使用 R 编程语言,我找到了此链接,其中提供了有关将数字从某个基数转换为不同基数的答案。
\n然而,这里似乎基数只能在 2 到 36 之间(我想要基数 60):
\nbase <- function(b, base = 10)\n{\n base <- as.integer(base)\n if(base > 36 | base < 2) stop("\'base\' must be between 2 and 36.")\n \n structure(lapply(b, function(x) \n {\n n <- ceiling(log(x, base))\n vec <- numeric()\n val <- x\n \n while(n >= 0)\n {\n rem <- val %/% base^n\n val <- val - rem * base^n\n vec <- c(vec, rem)\n n <- n - 1\n }\n \n while(vec[1] == 0 & length(vec) > 1) vec <- vec[-1]\n structure(x, base = base, representation = vec) \n }), class = "base")\n}\nRun Code Online (Sandbox Code Playgroud)\n我链接到的文章的标题是“在这个奇怪的以 60 为基数的世界中,八分之一等于七和三十” - 我希望看到这一点并将十进制中的“1/8”转换为“7 和 30”六十进制。
\n有人可以帮我解决这个问题吗?
\nBen*_*ker 11
给出的代码几乎可以工作。对基数 < 36 的限制只是因为原作者想用符号 [0-9A-Z] 来表达值。消除该限制并扩展算法以允许“小数点后”(或在基数 60 的情况下为“六十进制点后”:-))的额外数字,我们得到几乎可以工作的东西(下面的函数定义):
base(1/8, base = 60, digits = 6)
[[1]]
[1] 0.125
attr(,"base")
[1] 60
attr(,"representation")
[1] 7 29 59 59 59 59
attr(,"class")
[1] "base"
Run Code Online (Sandbox Code Playgroud)
我们得到的不是“7 30”,而是“7 29(59 重复)”,这类似于进行小数计算,结果应该是 0.2,结果却是 0.1999……
这可能可以通过适当的“数字模糊”阈值来修复。
代码中缺少的另一件事是,现在它处理小数部分,结果应该返回告诉您“小数”点所在位置的信息(最简单的是,包括digits输出中的值)。
代码的其他方面还可以改进(例如预分配vec而不是迭代地构建它)。
base <- function(b, base = 10, digits = 0) {
base <- as.integer(base)
structure(lapply(b, function(x)
{
n <- ceiling(log(x, base))
vec <- numeric()
val <- x
while(n >= -1*digits ) {
rem <- val %/% base^n
val <- val - rem * base^n
vec <- c(vec, rem)
n <- n - 1
}
while(vec[1] == 0 & length(vec) > 1) vec <- vec[-1]
structure(x, base = base, representation = vec)
}), class = "base")
}
Run Code Online (Sandbox Code Playgroud)