Тема: Проблема с нахождением целой части числа

Ставится задача определить сколько будет цифр в натуральном числе при переводе в другую систему счисления (использую Int(Log(x) / Log(y)) + 1 , где x - число в 10-чной с.сч., y - основание новой с.сч.)
Возникает ошибка при x=3^n, y=3, на других числах смысла пока нет тестить.
Int(Log(3) / Log(3)) выдаётся результат 0, хотя должно быть 1.
Трюк типа Int(Log(x) / Log(y)+0.0000001) исключён при больших значениях x (уже на 5-6 порядке).
Как решить проблемку?

Re: Проблема с нахождением целой части числа

Не очень понял смысла Log(3) / Log(3), если честно, но попробуй:

Sub test()
  MsgBox CStr(GetAnotherBase(3, 3))
End Sub
Public Function GetAnotherBase(x As Long, y As Long) As Long
  GetAnotherBase = Fix(Log(x) / Log(y)) + 1
End Function

Re: Проблема с нахождением целой части числа

Результат функции CStr(GetAnotherBase(3, 3)) должен бы выдавать число знаков после перевода.
Число 3 после перевода в систему счисления с основанием 3 состоит из двух знаков "10".
А выдаёт ответ 1 :(( я теряюсь, что происходит...

Re: Проблема с нахождением целой части числа

> Андрей
Может быть подойдет функция CInt?
Результат Log(3) имеет тип Double. Это означает, что первое вычилени Log(3) может отличаться от втрого Log(3) где-то в последних числах поле запятой. Причем разница может быть как с плюсом, так и с минусом. Эта разница не имеет в данном случае практического значения, но при сравнении может давать о себе знать. Здесь уже обсуждалась тема о результах использования типа Double.
Можно попробовать добавить округление числителя и знаменателя до нужного количества знаков после запятой или воспользоваться CSng(Log(3)).
У меня в VBA Excel 2007

Int(Log(3) / Log(3)) = 1

Число 3 после перевода в систему счисления с основанием 3 состоит из двух знаков "10".

Здесь можно поступить так

Число знаков=Len(Cstr(Натуральное число))

Re: Проблема с нахождением целой части числа

> brigval
Проблема как раз в том, что я организую цикл для определения этого самого "Натуральное число", а чтобы его найти сначала ищу число цифр получаемого числа. Пока это писал, пришла мысль... попробую организовать цикл while вместо for...

Re: Проблема с нахождением целой части числа

Андрей пишет:

число цифр получаемого числа

Число цифр получаемого числа = Len(CStr(CInt(Получаемое число)))

Re: Проблема с нахождением целой части числа

Написал такую функцию

Function chisloznakov(x, y) 'x-исходное, y-основание системы счисления
    tmp = Int(Abs(x))
    m = 0
    f = True
    While f
        m = m + 1
        If tmp < y ^ m Then f = False
    Wend
    chisloznakov = m
End Function

Проблемы с неточностями и погрешностями как не бывало.
Вроде работает :)