Редактировать : Я понимаю, что предполагал, что ввод будет character
, возможно, это неправильное предположение с моей стороны. Я полагаю, что доверять R, чтобы сохранить все ваши 0 и 1 (с учетом R FAQ 7.31 ) немного доверчиво, но я буду держать свой ответ как есть, если только / пока не произойдет что-то лучшее.
Это было интересно ... не уверен, есть ли функция R, которая имеет дело с плавающей точкой в недесятичной форме, так что вот одна ...
#' Convert floating-point binary to decimal
#'
#' @param s 'character'
#' @return 'numeric'
#' @examples
#' tests <- c("10100101", "0", "10100101.01", "-10100101", "-10100101.01", "111101111.010111")
#' base2float(tests)
#' # [1] 165.0000 0.0000 165.2500 -165.0000 -165.2500 495.3594
base2float <- function(s, base = 2L) {
# ensure the strings seem logical:
# - start with "-", "+", or "[01]"
# - zero or more "[01]"
# - optional decimal "." (can easily change to "," for alternate reps)
# - zero or more "[01]"
stopifnot(all(grepl("^[-+]?[01]*\\.?[01]*$", s)))
splits <- strsplit(s, "\\.")
wholes <- sapply(splits, `[[`, 1L)
wholes[wholes %in% c("", "-", "+")] <- paste0(wholes[wholes %in% c("", "-", "+")], "0")
fracs <- sapply(splits, `[`, 2L)
fracs[is.na(fracs)] <- "0"
# because string-length is used in our calcs ...
fracs <- gsub("0+$", "0", fracs)
whole10 <- strtoi(wholes, base = base)
frac10 <- strtoi(fracs, base = base) / (base^nchar(fracs))
whole10 + sign(whole10)*frac10
}