Как преобразовать число с плавающей запятой в сбалансированное троичное число?

Здесь у меня есть код, который преобразует сбалансированную троичную систему (-, 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, но сам не смог понять, как это сделать.


50
1

Ответ:

Решено

Для 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 равны или оба больше суммы, и в этом случае это ноль)