Вызов
Задача - написать программу, которая принимает положительные числа a
и ненулевое число b
и выводит a^b
(возведенное в степень b). Вы можете использовать только в + - * / abs()
качестве математических функций / операторов. Они могут применяться только к скалярным значениям, но не ко всем спискам или массивам.
Примеры:
1.234 ^ 5.678 = 3.29980
4.5 ^ 4.5 = 869.874
4.5 ^-4.5 = 0.00114959
Соответствующий: http://xkcd.com/217/
Детали
Вы можете написать функцию или аналогичную конструкцию для использования в консоли. Если вы не можете использовать консольный ввод, вы можете предположить, что оба числа сохраняются в переменных и выводятся через стандартный вывод или запись в файл. Выходные данные должны быть правильными, по крайней мере, до 4 значащих цифр. Можно предположить, что оба a
и b
ненулевые. Время выполнения, значительно превышающее 1 минуту, недопустимо. Наименьшее количество байтов выиграет. Пожалуйста, объясните вашу программу и ваш алгоритм.
РЕДАКТИРОВАТЬ: Только положительные основы должны быть рассмотрены. Вы можете предположить a>0
. Помните, что оба числа не должны быть целыми числами !!!
-0.5 ** 0.5
быть выход ?Ответы:
Python, 77
Как и с некоторыми другими ответами, это основано на log и exp. Но функции вычисляются путем численного решения обыкновенных дифференциальных уравнений.
Удовлетворяет ли это требованиям? Для примеров в вопросе, да. Для больших это займет очень много времени. Для больших a или b он станет неточным.
Примеры:
Обновление: Flawr попросил более подробную информацию о математике, так что вы идете. Я рассмотрел следующие проблемы начального значения:
Если я найду значение t такое, что x (t) = a, то у меня будет y (t) = exp (bt) = a ^ b. Простейшим способом численного решения начальной задачи является метод Эйлера . Вы вычисляете производную, которую должна иметь функция, и затем делаете шаг в направлении производной и пропорционально ей, но масштабируемой крошечной постоянной. Вот что я делаю, делаю крошечные шаги до тех пор, пока х не станет таким же большим, как и, а затем посмотрим, что у в это время. Ну, вот как я думал об этом. В моем коде t никогда не вычисляется явно (это 1e-7 * число шагов цикла while), и я сохранил некоторые символы, выполнив вычисления для x вместо a.
источник
JavaScript (E6) 155
174 191Редактировать 2 В соответствии с предложением @bebe, использование рекурсивной функции (работает хуже, но короче).
Немного изменена функция R, чтобы избежать «слишком большой рекурсии».
Добавлен набор тестов. Функция хорошо работает для базисов <3000 и экспоненты в диапазоне -50..50.
Редактировать Golff больше и точность
Любое действительное число может быть аппроксимировано рациональным числом (а стандартные «действительные» числа IEEE фактически хранят рациональные числа). Любое рациональное число может быть выражено как дробь a / b с целыми числами a и b. x ^ (a / b) - корень b из (x ^ a) или (корень b из x) ^ a. Целочисленное возведение в степень довольно легко возводить в квадрат. Целочисленный корень может быть аппроксимирован с использованием численных методов.
Код
Тест в консоли FireFox или FireBug
источник
e&1&&(r*=b)
делает, кроме умноженияr
наb
?if(e&1 != 0) r *= b
P=(x,e)=>(F=(b,e,r=1)=>e?F(b*b,e>>1,e&1?r*b:r):r,R=(b,e,g=1,y=1e-16,d=(b/F(g,e-1)-g)/e)=>d>y|d<-y?R(b,e,g+d):g,e<0&&(x=1/x,e=-e),f=1<<24,F(R(x,f),e*f))
(я должен быть уставшим)Хаскелл, 85
90Стандартный алгоритм exp-log. Теперь с другим именем, сбривая еще несколько символов:
raise
теперь вызывается(%)
или%
в инфиксной нотации, даже если его использование потребляет меньше байтов:4.5%(-4.5)
Версия ungolfed также использует всего 172 байта:
источник
JS (ES6), 103 байта
Примеры :
Используйте серию Тейлора.
b^x = 1 + ln(b)*x/1! + (ln(b)*x)^2/2! + (ln(b)*x)^3/3! + (ln(b)*x)^4/4! + ...
с приближением натурального логарифма :
ln(b) = (1-1/x) + (1-1/x)^2/2 + (1-1/x)^3/3 + (1-1/x)^4/4 + ...
Я использовал 128 итераций для вычисления
b^x
(больше итераций сложно из-за факториала) и 262144 итераций дляln(b)
источник
e(80,5) ->1555962210.2240903
играть в гольф, но добавьте больше точности: - должно быть 3276800000Golflua 120
Я использую тот факт, что
и написал свои собственные
log
&exp
функции. Значенияa
и ихb
необходимо вводить в новых строках при запуске в терминале:Образцы прогонов:
Безголосая версия Lua,
источник