Вы можете расширить решение , которое вы разместили в своем вопросе, чтобы включить также отрицательные степени двух, начиная с позиции десятичного разделителя, следующим образом:
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)))
}
Этот код также работает для других оснований, меньших (или равных) 10:
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