Bos saya baru saja mengatakan kepada saya untuk menulis fungsi kosinus. Menjadi ahli matematika yang baik, pikiran saya segera menyihir Seri Taylor yang sesuai.
cos(x) = 1 / 0! - x^2 / 2! + x^4 / 4! - x^6 / 6! + ... + (-1)^k x^(2k) / (2k)! + ...
Namun, bos saya sangat pemilih. Dia ingin dapat menentukan dengan tepat berapa banyak istilah dari Seri Taylor untuk dihitung. Bisakah Anda membantu saya menulis fungsi ini?
Tugas Anda
Diberi nilai floating point x
dari 0
ke 2 pi
dan bilangan bulat positif n
kurang dari 100
, hitung jumlah n
syarat pertama dari seri Taylor yang diberikan di atas cos(x)
.
Ini kode-golf , jadi kode terpendek menang. Input dan output dapat diambil dengan salah satu cara standar. Celah standar dilarang.
Catatan
- Masukan dapat diambil dalam bentuk apa pun yang wajar, selama ada pemisahan yang jelas antara
x
dann
. - Input dan output harus nilai floating-point, setidaknya seakurat menghitung rumus menggunakan nomor floating point IEEE presisi tunggal dengan beberapa aturan pembulatan standar.
- Jika masuk akal untuk bahasa yang digunakan, perhitungan dapat dilakukan dengan menggunakan jumlah rasional yang tepat, tetapi input dan output masih harus dalam bentuk desimal.
Contohnya
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
Silvio Mayolo
sumber
sumber
n
juga lebih besar dari0
?Jawaban:
Operasi bahasa scripting Flashpoint ,
165157 byteTelepon dengan:
Keluaran:
Saya cukup yakin bahwa angka-angka adalah angka floating point IEEE presisi tunggal, meskipun dalam hasil cetak desimal yang lebih panjang tidak begitu akurat. Ini adalah pencetakan yang membulatkan angka-angka seperti itu, sebenarnya angkanya lebih tepat.
Misalnya,
a=1.00001;b=1.000011;hint format["%1\n%2\n%3", a, b, a==b]
akan menampilkan ini:Jadi jelas ketepatan angka yang sebenarnya lebih besar dari ketepatan yang dicetak.
sumber
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}}}]
- Menembak ke beberapa arah menambah penghitung, dan kemudian menembak ke arah lain memanggil fungsi cosinus dengan arah sebelumnya dan jumlah tembakan ke arah itu.05AB1E ,
1411 byteCobalah online!
Penjelasan
sumber
²
, tetapi malah bisa digantikan olehI
.MATL , 14 byte
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan dengan contoh
Semua angka memiliki presisi ganda (ini adalah standar).
Pertimbangkan input
x = 2.0
,n = 5
.sumber
Mathematica,
49413931 byteVersi lama, lebih "menyenangkan": (39 byte)
Disimpan 10 byte berkat @Pavel dan 8 terima kasih ke @Greg Martin!
sumber
Series
kemampuan Mathematica memang luar biasa dan menyenangkan, ternyata implementasi dengan tanganSum[(-#^2)^k/(2k)!,{k,0,#2-1}]&
lebih pendek di sini.Jelly ,
1211 byteCobalah online!
Bagaimana?
sumber
Jelly, 22 byte
Ini adalah program lengkap yang menganggap n sebagai argumen pertama dan x sebagai argumen kedua.
Penjelasan:
sumber
Python, 54 byte
Jika menggunakan Python 2, pastikan untuk melewatkan x sebagai float, bukan bilangan bulat, tapi saya pemahaman saya adalah bahwa tidak masalah jika Anda menggunakan Python 3.
sumber
TI-Basic,
4140 byte1E-49
ditambahkan ke sudut karena TI-Basic melempar kesalahan untuk 0 ^ 0, itu hanya cukup besar untuk tidak menyebabkan kesalahan, dan itu tidak cukup besar untuk mengubah jawabannya.sumber
C, 96 byte
Rekursif Langsung
Terperinci
Progresif Rekursif, 133 byte Live
Terperinci
sumber
c(0.5, 80)
=> NaN, untuk overflowf(80)=0
n<100
sehingga Anda setidaknya tidak sampai sejauh itu dalam jangkauan. Bukan stack overflown<100
dan Anda menggunakanO(2^n)
solusi, saya kira tidak apa-apa, asalkan akhirnya retuan hasilnyaJavaScript (ES6), 46 byte
Mengambil input kari (x) (n).
sumber
C, 71 byte
menggunakan skema Horner
Versi tidak disatukan:
sumber
R,
7064 bytedisimpan 6 byte berkat jawaban pizzapants184 dengan trik (-x ^ 2) ^ y
65 byte:
cukup banyak implementasi naif ini tetapi sedikit golf; mengembalikan fungsi anonim yang menghitung seri Taylor ke n yang ditentukan
init
harus diatur ke 0gamma(n+1)
bukanfactorial(n)
1:n-1
setara dengan0:(n-1)
sumber
OK , 38 byte
Ini juga berfungsi dalam k , tetapi membutuhkan 39 byte karena kita
'
harus menulis sebagai/:
gantinya (setidaknya, dalam kmac 2016.06.28 memang demikian).Penjelasan:
Mari kita mulai dengan bit tengah.
(*/y#x)
adalah eksponensial, sama denganx^y
.*/1+!y
akan menjadiy!
, atauy
faktorial.%
adalah pembagian. Karena itu fungsi di tengah adalahmiddle(x,y) = (x^y)/(y!)
.Sekarang bit di sebelah kanan, di mana fungsi di atas diterapkan.
2*!y
adalah{0, 2, 4, ..., 2*(y-1)}
.x,'
menambahkanx
ke setiap item dalam daftar itu, mengubahnya menjadi{(x, 0), (x, 2), (x, 4), ..., (x, 2*(y-1))}
. The.'
kemudian berlakumiddle
untuk setiap pasangan nomor (map
, pada dasarnya).Akhirnya,
(y#1 -1)*
gandakan hasilnya dengan 1 atau -1 (bergantian), dan+/
ambil jumlahnya.sumber
Haskell, 71 Bytes
Ini adalah jawaban yang cukup membosankan yang tidak terlalu sulit untuk diuraikan. Tapi itu
fromIntegral
benar - benar menggigit. (/
Operator memerlukan operan dari tipe numerik yang sama di Haskell, dan paksaan antara tipe numerik tidak diperbolehkan tanpa fungsi bertele-tele.)sumber
f x n=sum[(-1)^i*x^(2*i)/fromIntegral(product[1..2*i])|i<-[0..n-1]]
Jelly , 12 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Pyth, 16 byte
Terima
n
dulu, lalux
. Contoh dijalankan.sumber
Haskell , 61 byte
Ini tampaknya cukup berbeda dari solusi Haskell lainnya untuk menjamin jawaban yang terpisah. Pelaksanaan harus cukup jelas-panggilan dengan
x#n
manax
adalah jumlah kosinus dari yang akan dihitung dann
merupakan urutan jumlah parsial yang akan diambil.sumber
fromIntegral
dan menggunakan**
di tempat^
, seperti inix#n=sum[(-x*x)**i/product[1..2*i]|i<-[0..n-1]]
menghemat 3 byte lagi.Pyt ,
373433 bytesumber
J,
2624 Bytes-2 byte terima kasih kepada @cole
Saya awalnya berencana menggunakan gerund siklik untuk bergantian antara menambah dan mengurangi, tetapi tidak bisa membuatnya bekerja.
Penjelasan:
sumber
+/@:(!@]%~^*_1^2%~])2*i.
Akan selidiki gerund siklik: mungkin gagal karena J mengevaluasi dari/
kanan ke kiri sehingga Anda perlu menggunakan|.
(atau mungkin Anda bertanggung jawab untuk ini dan masih mengalami kesulitan).Perl 6 , 53 byte
Cobalah online!
Ini benar-benar menghitung kompleks eksponensial e iθ untuk dua kali jumlah istilah yang diminta dan kemudian mengambil bagian nyata.
sumber
MATLAB dengan Symbolic Math Toolbox, 57 byte
Ini mendefinisikan fungsi anonim dengan yang mengambil
double
inputx
,n
dan output hasilnya sebagaidouble
.Contoh (diuji pada R2015b):
sumber
JavaScript ES7 60 byte
Untuk menggunakannya:
Tekan F12, ketik fungsi dan kemudian lakukan
sumber
C
144130 byteVersi Tidak Serigala:
Terima kasih Kevin telah menghemat beberapa byte!
sumber
F(m){...}f(x,n)float x;{...}
while(m)u*=m--
atauu=m;while(--m)u*=m
(panjang yang sama)i<=n-1
sama dengani<n
Tcl , 126 byte
Cobalah online!
sumber
Stax , 12 byte
Jalankan dan debug itu
Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.
Jalankan yang ini
sumber
JavaScript, 59 byte
Cobalah online!
sumber
PHP, 76 byte
mengambil
X
danN
dari argumen baris perintah; jalankan bersama-r
.lingkaran
$i
dari0
keN*2-1
, terusfac($i)
di$f
; jika$i
genap, tambahkan istilah ke jumlah$s
. jumlah cetak.Saya berharap saya memiliki bilangan kompleks (dengan
M_I
sebagai unit imajiner);Saya hanya akan mengalikan
$f
denganM_I*++$i
dan menyimpan 7 byte.Mungkin Mathematica dapat melakukannya. Tapi Mathematica tidak harus.
Saya bisa menyimpan dua byte dengan
cos(M_PI*$i/2)
alih - alih$i&1?:
dan(-1)**$k++
;tapi rasanya agak aneh menggunakan cosine builtin untuk membangun fungsi cosinus.
sumber
Aksioma, 36 byte
Bangun infinite (dalam arti terbatas tetapi orang dapat meminta untuk membangun daftar elemen 2 * n jika PC memiliki cukup memori) daftar jumlah parsial untuk seri Taylor untuk cos (x) menghitung dalam 'a', dalam "eval ( taylor (cos (x)), a) "; mendapat elemen 2 * n dari daftar itu di ". (2 * n)". Kasus uji:
sumber
J , 17 byte
Cobalah online!
Menggunakan built-in , yang saya anggap OK.
Sayangnya, saya tidak benar-benar tahu bagaimana bekerja dengan baik dengan fungsi yang mengambil argumen melalui currying seperti ini, jadi saya harus melakukan ini secara eksplisit. Saya yakin ada cara untuk melakukannya secara diam-diam atau lebih pendek.
sumber
Bersih , 77 byte
Cobalah online!
sumber