将数字从 10 进制转换为 60 进制

sta*_*oob 8 r decimal base-conversion

最近,我读到古巴比伦文明使用以 60 为基数而不是 10 为基数的数字系统。即使使用以 60 为基数的数字系统,他们仍然能够近似计算 2 \xe2\x80\x94 的平方根,并且几千年前也是如此!

\n

在此输入图像描述

\n

我对此很好奇,想看看如何将十进制(以 10 为基数)中的数字转换为六十进制(以 60 为基数)。使用 R 编程语言,我找到了此链接,其中提供了有关将数字从某个基数转换为不同基数的答案。

\n

然而,这里似乎基数只能在 2 到 36 之间(我想要基数 60):

\n
base <- 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}\n
Run Code Online (Sandbox Code Playgroud)\n

我链接到的文章的标题是“在这个奇怪的以 60 为基数的世界中,八分之一等于七和三十” - 我希望看到这一点并将十进制中的“1/8”转换为“7 和 30”六十进制。

\n

有人可以帮我解决这个问题吗?

\n

Ben*_*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)