Мой босс только что сказал мне написать функцию косинуса. Будучи хорошим математическим фанатом, мой разум сразу же вызвал соответствующую серию Тейлора.
cos(x) = 1 / 0! - x^2 / 2! + x^4 / 4! - x^6 / 6! + ... + (-1)^k x^(2k) / (2k)! + ...
Тем не менее, мой босс очень разборчив. Он хотел бы иметь возможность точно указать, сколько терминов из ряда Тейлора вычислить. Можете ли вы помочь мне написать эту функцию?
Твое задание
Учитывая значение x
с плавающей запятой от 0
до 2 pi
и положительное целое число n
меньше чем 100
, вычислите сумму первых n
членов ряда Тейлора, приведенных выше для cos(x)
.
Это код-гольф , поэтому выигрывает самый короткий код. Ввод и вывод могут быть приняты любым из стандартных способов. Стандартные лазейки запрещены.
Заметки
- Входные данные могут быть приняты в любой разумной форме, если есть четкое разделение между
x
иn
. - Вход и выход должны быть значениями с плавающей запятой, по крайней мере, такими же точными, как вычисление формулы с использованием чисел с плавающей запятой одинарной точности IEEE с некоторым стандартным правилом округления.
- Если это имеет смысл для используемого языка, вычисления могут выполняться с использованием точных рациональных величин, но входные и выходные данные все еще должны быть в десятичной форме.
Примеры
x | n | Output
----+----+--------------
0.0 | 1 | 1.0
0.5 | 1 | 1.0
0.5 | 2 | 0.875
0.5 | 4 | 0.87758246...
0.5 | 9 | 0.87758256...
2.0 | 2 | -1.0
2.0 | 5 | -0.4158730...
code-golf
math
trigonometry
calculus
Сильвио Майоло
источник
источник
n
это также больше, чем0
?Ответы:
Язык сценариев работы Flashpoint ,
165157 байтЗвоните с:
Выход:
Я вполне уверен, что числа являются числами с плавающей точкой IEEE одинарной точности, хотя в печатном выводе более длинные десятичные числа не столь точны. Именно печать округляет такие числа, на самом деле цифры более точные.
Например,
a=1.00001;b=1.000011;hint format["%1\n%2\n%3", a, b, a==b]
выведет это:Очевидно, что фактическая точность чисел выше точности печати.
источник
dir=-1;num=1;player addEventHandler ["fired", {_dir=getdir (nearestObject [_this select 0, _this select 4]);if (dir < 0) then {dir = _dir} else {if (abs(dir - _dir) < 5) then {num = num + 1} else {hint format["%1", [dir*(pi/180), num] call F];dir=-1;num=1}}}]
- Съемка в каком-то направлении увеличивает счетчик, а затем съемка в другом направлении вызывает функцию косинуса с более ранним направлением и количеством снимков в этом направлении.05AB1E ,
1411 байтПопробуйте онлайн!
объяснение
источник
²
, но вместо этого ее можно заменить наI
.MATL , 14 байтов
Попробуйте онлайн! Или проверьте все тестовые случаи .
Пояснение с примером
Все числа имеют двойную точность (это значение по умолчанию).
Рассмотрим входы
x = 2.0
,n = 5
.источник
Mathematica,
49413931 байтСтарая, более «веселая» версия: (39 байт)
Благодаря @Pavel сэкономлено 10 байтов, а благодаря @Greg Martin - 8!
источник
Series
возможности Mathematica действительно потрясающие и увлекательные, оказывается, что ручная реализацияSum[(-#^2)^k/(2k)!,{k,0,#2-1}]&
здесь короче.Желе ,
1211 байтПопробуйте онлайн!
Как?
источник
Желе, 22 байта
Это полная программа, которая принимает n в качестве первого аргумента и x в качестве второго.
Объяснение:
источник
Python, 54 байта
Если вы используете Python 2, обязательно передайте x как число с плавающей точкой, а не как целое число, но, насколько я понимаю, не имеет значения, используете ли вы Python 3.
источник
TI-Basic,
4140 байт1E-49
добавляется к углу, потому что TI-Basic выдает ошибку для 0 ^ 0, она просто достаточно велика, чтобы не вызвать ошибку, и недостаточно велика, чтобы изменить ответ.источник
C 96 байтов
Рекурсивный Live
Детальнее
Прогрессивно-рекурсивный, 133 байта Live
Детальнее
источник
c(0.5, 80)
f(80)=0
n<100
чтобы вы, по крайней мере, не заходили так далеко в диапазоне. Не переполнение стекаn<100
и вы используетеO(2^n)
решение, я думаю, что все в порядке, если это в конечном итоге приведет к результатуJavaScript (ES6), 46 байт
Принимает карри вводов (х) (п).
источник
C 71 байт
по схеме Хорнера
Безголовая версия:
источник
R,
7064 байтаспасло 6 байт благодаря ответу pizzapants184 с помощью (-x ^ 2) ^ уловки
65 байт:
довольно наивная реализация этого, но чуть-чуть в гольфе; возвращает анонимную функцию, которая вычисляет ряд Тейлора для указанного n
init
должно быть установлено в 0gamma(n+1)
вместоfactorial(n)
1:n-1
эквивалентно0:(n-1)
источник
ок , 38 байт
Это также работает в k , но занимает 39 байтов, потому что каждый
'
должен быть записан как/:
вместо (по крайней мере, в kmac 2016.06.28 это делает).Объяснение:
Давайте начнем со среднего бита.
(*/y#x)
это возведение в степень, это эквивалентноx^y
.*/1+!y
будетy!
илиy
факториал.%
это разделение. Поэтому функция посередине естьmiddle(x,y) = (x^y)/(y!)
.Теперь бит справа, к которому применяется вышеуказанная функция.
2*!y
есть{0, 2, 4, ..., 2*(y-1)}
.x,'
присваиваетx
каждому элементу в этом списке, превращая его в{(x, 0), (x, 2), (x, 4), ..., (x, 2*(y-1))}
..'
Затем применяетmiddle
к каждой паре чисел (map
по существу).Наконец,
(y#1 -1)*
умножает результат на 1 или -1 (поочередно) и+/
получает сумму.источник
Haskell, 71 байт
Это довольно скучный ответ, который не слишком сложно расшифровать.
fromIntegral
Действительно кусается, хотя. (/
Оператору требуются операнды с одинаковым числовым типом в Haskell, и принудительное использование числовых типов невозможно без многословной функции.)источник
f x n=sum[(-1)^i*x^(2*i)/fromIntegral(product[1..2*i])|i<-[0..n-1]]
Желе , 12 байт
Попробуйте онлайн!
Как это работает
источник
Pyth, 16 байт
Принимает
n
сначала, потомx
. Пример запуска.источник
Haskell , 61 байт
Это казалось достаточно отличным от другого решения Haskell, чтобы гарантировать отдельный ответ. Реализация должна быть достаточно понятной - вызывать
x#n
гдеx
число, косинус которого должен быть вычислен, иn
порядок частичной суммы, которую нужно взять.источник
fromIntegral
и использовав**
вместо них^
, например, этоx#n=sum[(-x*x)**i/product[1..2*i]|i<-[0..n-1]]
экономит еще 3 байта.Пыть ,
373433 байтаисточник
J,
2624 байта-2 байта благодаря @cole
Изначально я планировал использовать циклический герунд для чередования сложения и вычитания, но не смог заставить его работать.
Объяснение:
источник
+/@:(!@]%~^*_1^2%~])2*i.
собираюсь исследовать циклический герунд: он, вероятно, потерпел неудачу, поскольку J оценивает/
справа налево, поэтому вам нужно использовать|.
(или, возможно, вы учли это и все еще испытывали трудности).Perl 6 , 53 байта
Попробуйте онлайн!
Это фактически вычисляет комплексную экспоненту e iθ для двойного числа запрошенных членов и затем принимает действительную часть.
источник
MATLAB с символьным набором математических инструментов, 57 байт
Это определяет анонимную функцию , которая принимает с
double
входамиx
,n
и выводит результат в видеdouble
.Пример (проверено на R2015b):
источник
JavaScript ES7 60 байт
Чтобы использовать это:
Нажмите F12, введите функцию и затем выполните
источник
C
144130 байтовБезголовая версия:
Спасибо Кевину за сохранение некоторых байтов!
источник
F(m){...}f(x,n)float x;{...}
while(m)u*=m--
илиu=m;while(--m)u*=m
одинаковой длины)i<=n-1
так же, какi<n
Tcl , 126 байт
Попробуйте онлайн!
источник
Stax , 12 байт
Запустите и отладьте его
Распакованный, размазанный и прокомментированный, это выглядит так.
Запустите этот
источник
JavaScript, 59 байт
Попробуйте онлайн!
источник
PHP, 76 байт
берет
X
иN
из аргументов командной строки; беги с-r
.цикл
$i
от0
доN*2-1
, удерживатьfac($i)
в$f
; если$i
четное, добавьте термин к сумме$s
. печать суммы.Я хотел бы иметь комплексные числа (с
M_I
мнимой единицей);Я бы просто умножить
$f
сM_I*++$i
и сохранить 7 байт.Может быть, Mathematica может сделать это. Но Mathematica не обязана.
Я мог бы сохранить два байта с
cos(M_PI*$i/2)
вместо$i&1?:
и(-1)**$k++
;но было бы немного странно использовать встроенный косинус для построения функции косинуса.
источник
Аксиома, 36 байт
Построить бесконечный (в смысле конечный, но можно попросить построить список из 2 * n элементов, если на компьютере достаточно памяти) список частичных сумм для ряда Тейлора для cos (x), вычисляемый в «a», in «eval ( Тейлор (COS (х)), а) "; получает элемент 2 * n этого списка в ". (2 * n)". Тестовые случаи:
источник
J , 17 байт
Попробуйте онлайн!
Использует встроенный , который, я полагаю, в порядке.
К сожалению, я действительно не знаю, как хорошо работать с функциями, которые принимают аргументы через карри, как это, поэтому я должен был сделать это явно. Я уверен, что есть способ сделать это молчаливо или короче.
источник
Чисто , 77 байт
Попробуйте онлайн!
источник