在R中如何将二进制分数转换为十进制分数?
我需要编写一个函数,将二进制分数转换为十进制分数,例如在R中如何将二进制分数转换为十进制分数?,r,decimal,base,fractions,R,Decimal,Base,Fractions,我需要编写一个函数,将二进制分数转换为十进制分数,例如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:
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,0,1)*(0.5^1,0.5^2,0.5^3)
似乎解决了这个问题,我不知道在一般情况下如何解决这个问题
javascript大小写:lisp大小写:
库(cwhmisc)#内部,分形
从2到10您可以扩展您在问题中发布的内容,以包括从小数点分隔符位置开始的2的负幂,如下所示:
base2decimal <- function(base_number, base = 2) {
base_number = paste(as.character(base_number), ".", sep = "")
return (mapply(function (val, sep) {
val = val[-sep];
if (val[[1]] == "-") {
sign = -1
powmax = sep[[1]] - 3
val = val[-1]
} else {
sign = 1
powmax = sep[[1]] - 2
};
sign * sum(as.numeric(val) * (base ^ seq(powmax, by = -1, length = length(val))))},
strsplit(base_number, NULL), gregexpr("\\.", base_number)))
}
我理解所有的推导,包括你推理的最后一部分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。我在一个解附近:sum(c(0,0,1)*(0.5^(1:3))#0.125
和sum(c(1,0,1)*(0.5^(1:3))#0.625
。
library(cwhmisc) # int, frac
from2to10 <- function(n) {
SignOfNumber <- ""
if (n < 0) {
n <- abs(n)
SignOfNumber <- "-"}
nWhole <- int(n)
nWhole <- as.character(nWhole)
nFraction <- frac(n)
nFraction <- as.character(nFraction)
DecimalWhole <- sapply(strsplit(nWhole, split=""), function(x) sum(as.numeric(x) * 2^(rev(seq_along(x) - 1))))
if (nFraction == 0) {
DecimalFraction <- ""
paste0(SignOfNumber, DecimalWhole)
} else { # Find decimal fraction part
part3 <- function(x, y, z) { eval(parse(text=(paste(x, y, z,sep="")))) }
y <- as.numeric(strsplit(substr(part3("\"",n,"\""), which(strsplit(part3("\"",n,"\""), "")[[1]]==".") + 1, nchar(part3("\"",n,"\""))),"")[[1]])
DecimalFraction <- sum(y * (0.5^(1:length(y))))
paste0(SignOfNumber, DecimalWhole + DecimalFraction)
}
}
from2to10(0.001) # "0.125"
as.numeric(from2to10(0.001)) # 0.125
base2decimal <- function(base_number, base = 2) {
base_number = paste(as.character(base_number), ".", sep = "")
return (mapply(function (val, sep) {
val = val[-sep];
if (val[[1]] == "-") {
sign = -1
powmax = sep[[1]] - 3
val = val[-1]
} else {
sign = 1
powmax = sep[[1]] - 2
};
sign * sum(as.numeric(val) * (base ^ seq(powmax, by = -1, length = length(val))))},
strsplit(base_number, NULL), gregexpr("\\.", base_number)))
}
base2decimal(c('0.101', '.101', 0.101, 1101.001, 1101, '-0.101', '-.101', -0.101, -1101.001, -1101))
#[1] 0.625 0.625 0.625 13.125 13.000 -0.625 -0.625 -0.625 -13.125
#[10] -13.000
base2decimal(1110.111)
# 14.875
base2decimal(256.3, 8)
# [1] 174.375