Здесь у меня есть код, который преобразует сбалансированную троичную систему (-, 0, +) как строку минусов, нулей и плюсов в число с плавающей запятой (двойное число). Как инвертировать эту функцию? Я хочу получить сбалансированный троичный эквивалент числа с плавающей запятой.
public static func convertBT2FL(ternaryString: String) -> Double {
var exp : Double = 0
var sum : Double = 0
for trit in ternaryString {
var tritN : Double = 0
if trit == "+" {
tritN = 1
} else if trit == "0" {
tritN = 0
} else if trit == "-" {
tritN = -1
}
sum += tritN * pow(3.0, exp)
exp -= 1
}
return sum
}
public static func convertFL2BT(doubleValue: Double) -> String {
//invert function here
}
Я знаю, как нормализовать число так, чтобы оно всегда было между -1,5 и 1,5 (поэтому мантисса всегда может быть представлена как +.-++-++, а не +-++.-++), выполнив следующие действия:
var n = ceil((log(abs(significandValueDouble)) - log(1.5)) / log(3))
var newSignificand = significandValueDouble / pow(3.0, n)
Но я не знаю, как преобразовать полученный newSignificand
в сбалансированный троичный код. Я нашел сайт, который выполняет такое преобразование https://chridd.nfshost.com/convert/original, но сам не смог понять, как это сделать.
Для 19-значного сбалансированного троичного числа ответ (беспорядочный):
for n in Range(uncheckedBounds: (0, 19)) {
if ( abs( sum - -1 * pow(3.0, Double(-n)) ) < abs( sum - 1 * pow(3.0, Double(-n)) ) ) && ( abs( sum - -1 * pow(3.0, Double(-n)) ) < abs(sum) ){
sum -= -1 * pow(3.0, Double(-n))
significand += "-"
} else if ( abs( sum - -1 * pow(3.0, Double(-n)) ) > abs( sum - 1 * pow(3.0, Double(-n))) ) && ( abs( sum - 1 * pow(3.0, Double(-n))) < abs(sum) ) {
sum -= 1 * pow(3.0, Double(-n))
significand += "+"
} else {
significand += "0"
}
}
При этом принимается абсолютное значение разницы между суммой и двумя вариантами — он пробует это либо с 1, либо с -1, умноженным на 3 в степени n, по мере того, как n идет от первой цифры к последней (слева направо), и тот, который наименьший, выигрывает и добавляется к строке, значимой как + или - (в том числе, если 1 или -1 равны или оба больше суммы, и в этом случае это ноль)