【发布时间】:2019-06-01 22:58:08
【问题描述】:
我需要在 R 中编写一个将二进制小数转换为十进制小数的函数。例如f(0.001) # 0.125
我做了什么:我在R包中搜索了相关函数:
DescTools::BinToDec(0.001) # NA
DescTools::BinToDec("0.001") # NA
base::strtoi(0.001, base=2) # NA
base::strtoi("0.001", base=2) # NA
base::packBits(intToBits(0.001), "integer") # 0
base::packBits(intToBits("0.001"), "integer") # 0
compositions::unbinary(0.001) # 0.001
compositions::unbinary("0.001") # NA
我在 SOF 中搜索,发现如下:
base2decimal <- function(base_number, base = 2) {
split_base <- strsplit(as.character(base_number), split = "")
return(sapply(split_base, function(x) sum(as.numeric(x) * base^(rev(seq_along(x) - 1)))))}
base2decimal(0.001) # NA
base2decimal("0.001") # NA
0.001 是:
(0 * 2^(-1)) + (0 * 2^(-2)) + (1 * 2^(-3)) # 0.125
(0 * 1/2) + (0 * (1/2)^2) + (1 * (1/2)^3) # 0.125
(0 * 0.5) + (0 * (0.5)^2) + (1 * 0.5^3) # 0.125
所以,像内积的总和(0,0,1) * (0.5^1, 0.5^2, 0.5^3) 似乎解决了这个问题,我不知道在一般情况下如何做到这一点。
javascript案例:
How to convert a binary fraction number into decimal fraction number?
How to convert binary fraction to decimal
lisp 案例:
Convert fractions from decimal to binary
【问题讨论】:
-
我理解所有推导,包括你推理中的最后一部分 x=2^(-3)。不幸的是,我看不到您如何获得
(0.001)base2 = (x)base10 => log_2(x) = log_10(0.001);注意 0.001 和 x 在相反的一边! -
@jenesaisquoi 2^log(0.001, 10) 技术在某些情况下会失败!观察:2^log(0.101, 10) # 0.5014999 而 0.101 = (1*1/2) + (0*1/2^2) + (1*1/2^3)=1*0.5 + 0*0.25 + 1*0.125=0.625。和 0.50149990.625.
-
我在附近有一个解决方案:
sum(c(0,0,1)* (0.5^(1:3))) # 0.125和sum(c(1,0,1)* (0.5^(1:3))) # 0.625。