Mein Chef hat mir gerade gesagt, ich soll eine Kosinusfunktion schreiben. Da ich ein guter Mathematikfreak bin, beschwor ich sofort die passende Taylor-Serie.
cos(x) = 1 / 0! - x^2 / 2! + x^4 / 4! - x^6 / 6! + ... + (-1)^k x^(2k) / (2k)! + ...
Mein Chef ist jedoch sehr wählerisch. Er möchte genau angeben können, wie viele Terme der Taylor-Reihe berechnet werden sollen. Können Sie mir helfen, diese Funktion zu schreiben?
Deine Aufgabe
Berechnen Sie bei einem Gleitkommawert x
von 0
bis 2 pi
und einer positiven ganzen Zahl n
kleiner als 100
die Summe der ersten n
Terme der oben angegebenen Taylor-Reihe für cos(x)
.
Das ist Code-Golf , also gewinnt der kürzeste Code. Die Ein- und Ausgabe kann auf eine der üblichen Arten erfolgen. Standardlücken sind verboten.
Anmerkungen
- Die Eingabe kann in jeder angemessenen Form erfolgen, sofern eine klare Trennung zwischen
x
und bestehtn
. - Eingabe und Ausgabe sollten Gleitkommawerte sein, mindestens so genau wie die Berechnung der Formel unter Verwendung von IEEE-Gleitkommazahlen mit einfacher Genauigkeit und einigen Standardrundungsregeln.
- Wenn es für die verwendete Sprache sinnvoll ist, können Berechnungen mit genauen rationalen Größen durchgeführt werden, aber die Eingabe und Ausgabe müssen immer noch in Dezimalform erfolgen.
Beispiele
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
quelle
quelle
n
das auch größer ist als0
?Antworten:
Operation Flashpoint- Skriptsprache,
165 bis157 ByteRufen Sie an mit:
Ausgabe:
Ich bin mir ziemlich sicher, dass die Zahlen IEEE-Gleitkommazahlen mit einfacher Genauigkeit sind, obwohl die längeren Dezimalstellen in der gedruckten Ausgabe nicht so genau sind. Es ist der Druck, der die Zahlen so rundet, tatsächlich sind die Zahlen präziser.
Zum Beispiel wird
a=1.00001;b=1.000011;hint format["%1\n%2\n%3", a, b, a==b]
Folgendes ausgegeben:Die tatsächliche Genauigkeit der Zahlen ist also eindeutig höher als die gedruckte Genauigkeit.
quelle
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}}}]
- Wenn Sie in eine Richtung aufnehmen, wird der Zähler inkrementiert, und wenn Sie dann in eine andere Richtung aufnehmen, wird die Kosinusfunktion mit der früheren Richtung und der Anzahl der Aufnahmen in dieser Richtung aufgerufen.05AB1E ,
1411 BytesProbieren Sie es online!
Erläuterung
quelle
²
, aber er kann stattdessen durch ersetzt werdenI
.MATL , 14 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erklärung mit Beispiel
Alle Zahlen haben doppelte Genauigkeit (dies ist die Standardeinstellung).
Betrachten Sie Eingänge
x = 2.0
,n = 5
.quelle
Mathematica,
49413931 BytesAlte, "spaßigere" Version: (39 Bytes)
10 Bytes dank @Pavel und 8 dank @Greg Martin!
quelle
Series
Fähigkeiten in der Tat großartig sind und Spaß machen, stellt sich heraus, dass die Implementierung von HandSum[(-#^2)^k/(2k)!,{k,0,#2-1}]&
hier kürzer ist.Jelly ,
1211 BytesProbieren Sie es online!
Wie?
quelle
Jelly, 22 Bytes
Dies ist ein vollständiges Programm, das n als erstes Argument und x als zweites Argument verwendet.
Erläuterung:
quelle
Python, 54 Bytes
Wenn Sie Python 2 verwenden, müssen Sie x als Gleitkommazahl übergeben, nicht als Ganzzahl. Meines Wissens ist es jedoch unerheblich, ob Sie Python 3 verwenden.
quelle
TI-Basic,
41 bis40 Byte1E-49
Wird dem Winkel hinzugefügt, weil TI-Basic einen Fehler für 0 ^ 0 ausgibt. Er ist gerade groß genug, um den Fehler nicht zu verursachen, und nicht groß genug, um die Antwort zu ändern.quelle
C 96 Bytes
Rekursives Leben
Detailliert
Progressiv Rekursiv, 133 Bytes Live
Detailliert
quelle
c(0.5, 80)
=> NaN, für Überlauff(80)=0
n<100
damit du zumindest nicht so weit in den Bereich gehst. Nicht Stapelüberlaufn<100
und Sie verwendenO(2^n)
Lösung ich denke , es ist okay, solange es schließlich das Ergebnis retuanJavaScript (ES6), 46 Byte
Nimmt Curry-Eingänge (x) (n).
quelle
C 71 Bytes
unter Verwendung des Horner-Schemas
Ungolfed-Version:
quelle
R,
7064 Bytes6 Bytes gespart dank der Antwort von pizzapants184 mit dem (-x ^ 2) ^ y-Trick
65 Bytes:
so ziemlich die naive Umsetzung davon, aber ein kleines bisschen golfen; Gibt eine anonyme Funktion zurück, die die Taylor-Reihe mit dem angegebenen n berechnet
init
es auf 0 gesetzt werden mussgamma(n+1)
stattfactorial(n)
1:n-1
ist äquivalent zu0:(n-1)
quelle
ok , 38 bytes
Dies funktioniert auch in k , benötigt aber 39 Bytes, da stattdessen
'
geschrieben/:
werden muss (zumindest in kmac 2016.06.28).Erläuterung:
Beginnen wir mit dem mittleren Teil.
(*/y#x)
ist Potenzierung, es ist äquivalent zux^y
.*/1+!y
wärey!
, odery
Fakultät.%
ist Teilung. Daher ist die Funktion in der Mittemiddle(x,y) = (x^y)/(y!)
.Nun das Bit rechts, auf das die obige Funktion angewendet wird.
2*!y
ist{0, 2, 4, ..., 2*(y-1)}
.x,'
Stelltx
jedem Element in dieser Liste ein vorangestelltes Element voran und verwandelt es in{(x, 0), (x, 2), (x, 4), ..., (x, 2*(y-1))}
. Das.'
gilt dann fürmiddle
jedes Zahlenpaar (map
im Wesentlichen).Zum Schluss
(y#1 -1)*
multipliziert man das Ergebnis mit 1 oder -1 (alternierend) und+/
erhält die Summe.quelle
Haskell, 71 Bytes
Dies ist eine ziemlich langweilige Antwort, die nicht zu schwer zu entziffern ist. Das
fromIntegral
beißt aber wirklich. (Der/
Operator benötigt in Haskell Operanden desselben numerischen Typs, und das Erzwingen zwischen numerischen Typen ist ohne eine wordy-Funktion nicht zulässig.)quelle
f x n=sum[(-1)^i*x^(2*i)/fromIntegral(product[1..2*i])|i<-[0..n-1]]
Gelee , 12 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
Pyth, 16 Bytes
Akzeptiert
n
dann zuerstx
. Beispiellauf.quelle
Haskell , 61 Bytes
Dies schien sich von der anderen Haskell-Lösung zu unterscheiden und eine separate Antwort zu rechtfertigen. Die Umsetzung sollte ziemlich selbsterklärend-Anruf sein , mit
x#n
denenx
die Zahl der Kosinus von denen berechnet werden undn
ist die Ordnung der Teilsumme genommen werden.quelle
fromIntegral
und**
anstelle von verwenden^
, wie diesx#n=sum[(-x*x)**i/product[1..2*i]|i<-[0..n-1]]
Spart 3 weitere Bytes.Pyt ,
373433 Bytesquelle
J,
2624 Bytes-2 Bytes dank @cole
Ursprünglich wollte ich ein zyklisches Gerundium verwenden, um zwischen Addieren und Subtrahieren zu wechseln, aber ich konnte es nicht zum Laufen bringen.
Erläuterung:
quelle
+/@:(!@]%~^*_1^2%~])2*i.
Ich werde ein zyklisches Gerundium untersuchen: Es ist wahrscheinlich fehlgeschlagen, da J von/
rechts nach links ausgewertet wird , damit Sie es verwenden müssen|.
(oder vielleicht haben Sie dies erklärt und hatten immer noch Schwierigkeiten).Perl 6 , 53 Bytes
Probieren Sie es online!
Dies berechnet tatsächlich das komplexe Exponential e iθ für die doppelte Anzahl der angeforderten Terme und nimmt dann den Realteil ein.
quelle
MATLAB mit Symbolic Math Toolbox, 57 Byte
Dies definiert eine anonyme Funktion mit übernimmt , dass
double
Eingabenx
,n
und gibt das Ergebnis als eindouble
.Beispiel (getestet an R2015b):
quelle
JavaScript ES7 60 Bytes
Um es zu benutzen:
Drücken Sie die Taste F12, geben Sie die Funktion ein und klicken Sie dann auf OK
quelle
C
144130 BytesUngolfed Version:
Danke Kevin, dass du ein paar Bytes gespart hast!
quelle
F(m){...}f(x,n)float x;{...}
while(m)u*=m--
oderu=m;while(--m)u*=m
(gleiche Länge) macheni<=n-1
ist das gleiche wiei<n
Tcl , 126 Bytes
Probieren Sie es online!
quelle
Stax , 12 Bytes
Führen Sie es aus und debuggen Sie es
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
quelle
JavaScript, 59 Bytes
Probieren Sie es online!
quelle
PHP, 76 Bytes
nimmt
X
undN
von Kommandozeilenargumenten; renn mit-r
.Schleife
$i
von0
bisN*2-1
, haltefac($i)
in$f
; Wenn gerade$i
ist, addiere den Term zur Summe$s
. Summe drucken.Ich wünschte, ich hätte komplexe Zahlen (mit
M_I
als imaginäre Einheit);Ich würde einfach mehrfach
$f
mitM_I*++$i
und speichern 7 Bytes.Vielleicht kann Mathematica das auch. Aber Mathematica muss nicht.
Ich könnte zwei Bytes mit
cos(M_PI*$i/2)
anstelle von$i&1?:
und speichern(-1)**$k++
;Es würde sich jedoch etwas seltsam anfühlen, einen Cosinus zu verwenden, um eine Cosinusfunktion zu erstellen.
quelle
Axiom, 36 Bytes
Bilde die unendliche (in der Bedeutung endlich, aber man kann fragen, ob die Liste der 2 * n Elemente erstellt werden soll, wenn der PC genügend Speicher hat) Liste der Teilsummen für die Taylor-Reihe für cos (x) berechne in 'a', in "eval ( Taylor (cos (x)), a) "; Ruft das 2 * n-Element dieser Liste in ". (2 * n)" ab. Testfälle:
quelle
J , 17 Bytes
Probieren Sie es online!
Verwendet ein eingebautes , was ich für OK halte.
Leider weiß ich nicht so recht, wie ich mit Funktionen umgehen soll, die Argumente über ein solches Currying annehmen. Deshalb musste ich dies explizit tun. Ich bin sicher, dass es eine Möglichkeit gibt, es stillschweigend oder kürzer zu machen.
quelle
Sauber , 77 Bytes
Probieren Sie es online!
quelle