Корень проблемы в том, что функция журнала, подверженная ошибкам усечения с плавающей запятой, используется для решения вопроса в области натуральных чисел. Во-первых, я должен указать, что на самом деле в приведенном примере 1 действительно является правильным ответом. Мы ищем наибольший x такой, что p^x ‹ n; не p^x ‹= n. 2^1 ‹ 4, а 2^2 — нет. Тем не менее, у нас все еще есть проблема, потому что, когда p ^ x = n для некоторого x, log(n), деленное на log(p), вероятно, с таким же успехом могло бы оказаться немного выше целого числа, а не ниже, если только не существует какой-либо системной смещения в реализации логарифмической функции. Таким образом, в этом случае, когда есть некоторый x, для которого p^x=n, мы на самом деле хотим быть уверены, что округляем до следующего меньшего целого значения для x.
Таким образом, даже такое решение не решит эту проблему:
display truncate(round(log(4) / log(2), 10) , 0) .
Я вижу два способа справиться с этим. Один из них похож на то, что вы уже пробовали, за исключением того, что, поскольку мы на самом деле хотим округлить до следующего меньшего натурального числа, мы будем вычитать, а не добавлять:
display truncate(log(4) / log(2) - 0.00000001, 0) .
Это будет работать до тех пор, пока n меньше 10 ^ 16, но более аккуратным решением было бы установить граничные условия с помощью фактической целочисленной математики. Конечно, это тоже не удастся, если вы доберетесь до чисел, превышающих максимальное целочисленное значение. Но если это не проблема, вы можете просто использовать свое первое решение, чтобы получить приблизительное решение:
display truncate(log(4) / log(2) , 0) .
А затем проверьте, работает ли результат в уравнении p^x ‹ n. Если оно не меньше n, вычтите единицу и повторите попытку.
Между прочим, в определение натуральных чисел не входит ноль, поэтому, если наименьшее возможное значение для x равно 1, то наименьшее возможное значение для p^x равно p, поэтому, если n меньше или равно p, не существует решения в натуральных числах.
person
Mark Bailey
schedule
07.10.2013