Mon patron m'a juste dit d'écrire une fonction cosinus. Étant un bon connaisseur de mathématiques, mon esprit a immédiatement évoqué la série Taylor appropriée.
cos(x) = 1 / 0! - x^2 / 2! + x^4 / 4! - x^6 / 6! + ... + (-1)^k x^(2k) / (2k)! + ...
Cependant, mon patron est très difficile. Il aimerait pouvoir spécifier exactement le nombre de termes de la série Taylor à calculer. Pouvez-vous m'aider à écrire cette fonction?
Ta tâche
Étant donné une valeur en virgule flottante x
de 0
à 2 pi
et un entier positif n
inférieur à 100
, calculer la somme des premiers n
termes de la série de Taylor donnée ci-dessus pour cos(x)
.
C'est le code-golf , donc le code le plus court l'emporte. L'entrée et la sortie peuvent être prises de n'importe quelle manière standard. Les failles standard sont interdites.
Remarques
- L'entrée peut être prise sous toute forme raisonnable, tant qu'il existe une séparation claire entre
x
etn
. - L'entrée et la sortie doivent être des valeurs à virgule flottante, au moins aussi précises que le calcul de la formule à l'aide de nombres à virgule flottante IEEE simple précision avec une règle d'arrondi standard.
- Si cela a du sens pour le langage utilisé, les calculs peuvent être effectués en utilisant des quantités rationnelles exactes, mais l'entrée et la sortie doivent toujours être sous forme décimale.
Exemples
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
la source
la source
n
c'est aussi plus grand que0
?Réponses:
Operation Flashpoint la langue,
165157 octetsAppeler avec:
Sortie:
Je suis assez sûr que les nombres sont des nombres à virgule flottante IEEE simple précision, même si dans la sortie imprimée les décimales plus longues ne sont pas aussi précises. C'est l'impression qui arrondit les chiffres comme ça, en fait les chiffres sont plus précis.
Par exemple,
a=1.00001;b=1.000011;hint format["%1\n%2\n%3", a, b, a==b]
affichera ceci:Il est donc clair que la précision réelle des nombres est supérieure à la précision imprimée.
la source
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}}}]
- La prise de vue dans une direction incrémente le compteur, puis la prise de vue dans une autre direction appelle la fonction cosinus avec la direction précédente et le nombre de prises de vue dans cette direction.05AB1E ,
1411 octetsEssayez-le en ligne!
Explication
la source
²
, mais il peut à la place être remplacé parI
.MATL , 14 octets
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication avec exemple
Tous les nombres ont une double précision (c'est la valeur par défaut).
Tenez compte des entrées
x = 2.0
,n = 5
.la source
Mathematica,
49413931 octetsAncienne version plus "fun": (39 octets)
10 octets enregistrés grâce à @Pavel et 8 grâce à @Greg Martin!
la source
Series
capacité de Mathematica soit en effet impressionnante et amusante, il s'avère que l'implémentation manuelleSum[(-#^2)^k/(2k)!,{k,0,#2-1}]&
est plus courte ici.Gelée ,
1211 octetsEssayez-le en ligne!
Comment?
la source
Gelée, 22 octets
Il s'agit d'un programme complet qui prend n comme premier argument et x comme second.
Explication:
la source
Python, 54 octets
Si vous utilisez Python 2, assurez-vous de passer x comme un flottant, pas un entier, mais je crois comprendre que peu importe si vous utilisez Python 3.
la source
TI-Basic,
4140 octets1E-49
est ajouté à l'angle car TI-Basic renvoie une erreur pour 0 ^ 0, il est juste assez grand pour ne pas provoquer l'erreur et il n'est pas assez grand pour changer la réponse.la source
C, 96 octets
Récursif en direct
Détaillé
Progressive Recursive, 133 bytes Live
Détaillé
la source
c(0.5, 80)
=> NaN, pour débordementf(80)=0
n<100
donc vous au moins n'allez pas aussi loin dans la gamme. Pas de débordement de pilen<100
et que vous utilisez laO(2^n)
solution, je suppose que ça va, tant que cela retoune finalement le résultatJavaScript (ES6), 46 octets
Prend les entrées au curry (x) (n).
la source
C, 71 octets
en utilisant le schéma Horner
Version non golfée:
la source
R,
7064 octetssauvé 6 octets grâce à la réponse de pizzapants184 avec l'astuce (-x ^ 2) ^ y
65 octets:
à peu près la mise en œuvre naïve de cela, mais un peu de golf; renvoie une fonction anonyme qui calcule la série Taylor au n spécifié
init
elle doit être définie sur 0gamma(n+1)
au lieu defactorial(n)
1:n-1
est équivalent à0:(n-1)
la source
oK , 38 octets
Cela fonctionne également en k , mais prend 39 octets car il
'
faut écrire comme à la/:
place (au moins, dans kmac 2016.06.28 c'est le cas).Explication:
Commençons par le bit du milieu.
(*/y#x)
est l'exponentiation, elle est équivalente àx^y
.*/1+!y
seraity!
, ouy
factorielle.%
est la division. Par conséquent, la fonction au milieu estmiddle(x,y) = (x^y)/(y!)
.Maintenant, le bit à droite, auquel la fonction ci-dessus est appliquée.
2*!y
est{0, 2, 4, ..., 2*(y-1)}
.x,'
ajoutex
à chaque élément de cette liste, le transformant en{(x, 0), (x, 2), (x, 4), ..., (x, 2*(y-1))}
. Le.'
s'applique alorsmiddle
à chaque paire de nombres (map
, essentiellement).Enfin,
(y#1 -1)*
multiplie le résultat par 1 ou -1 (en alternance) et+/
prend la somme.la source
Haskell, 71 octets
C'est une réponse assez ennuyeuse qui n'est pas trop difficile à déchiffrer. Les
fromIntegral
piqûres vraiment, cependant. (L'/
opérateur requiert des opérandes du même type numérique dans Haskell, et la coercition entre les types numériques n'est pas autorisée sans une fonction verbeuse.)la source
f x n=sum[(-1)^i*x^(2*i)/fromIntegral(product[1..2*i])|i<-[0..n-1]]
Gelée , 12 octets
Essayez-le en ligne!
Comment ça marche
la source
Pyth, 16 octets
Accepte d'
n
abord, ensuitex
. Exemple d'exécution.la source
Haskell , 61 octets
Cela semblait suffisamment différent de l'autre solution Haskell pour justifier une réponse distincte. La mise en œuvre devrait être assez explicite - appelez avec
x#n
oùx
est le nombre dont le cosinus doit être calculé etn
l'ordre de la somme partielle à prendre.la source
fromIntegral
et en utilisant**
à la place de^
, comme celui- cix#n=sum[(-x*x)**i/product[1..2*i]|i<-[0..n-1]]
enregistre 3 octets supplémentaires.Pyt ,
373433 octetsla source
J,
2624 octets-2 octets grâce à @cole
À l'origine, j'avais prévu d'utiliser un gérondif cyclique pour alterner entre l'ajout et la soustraction, mais je n'ai pas pu le faire fonctionner.
Explication:
la source
+/@:(!@]%~^*_1^2%~])2*i.
Je vais enquêter sur un gérondif cyclique: il a probablement échoué car J évalue de/
droite à gauche, vous devez donc l'utiliser|.
(ou peut-être avez-vous expliqué cela et avez-vous toujours eu des difficultés).Perl 6 , 53 octets
Essayez-le en ligne!
Cela calcule en fait l'exponentielle complexe e iθ pour le double du nombre de termes demandés, puis prend la partie réelle.
la source
MATLAB avec Symbolic Math Toolbox, 57 octets
Ceci définit une fonction anonyme qui prend avec des
double
entréesx
,n
et renvoie le résultat commedouble
.Exemple (testé sur R2015b):
la source
JavaScript ES7 60 octets
Pour l'utiliser:
Appuyez sur F12, saisissez la fonction, puis faites
la source
C
144130 octetsVersion non golfée:
Merci Kevin d'avoir économisé quelques octets!
la source
F(m){...}f(x,n)float x;{...}
while(m)u*=m--
ouu=m;while(--m)u*=m
(même longueur)i<=n-1
est le même quei<n
Tcl , 126 octets
Essayez-le en ligne!
la source
Stax , 12 octets
Exécuter et déboguer
Déballé, non golfé et commenté, il ressemble à ceci.
Exécutez celui-ci
la source
JavaScript, 59 octets
Essayez-le en ligne!
la source
PHP, 76 octets
prend
X
etN
des arguments de ligne de commande; courir avec-r
.boucle
$i
de0
àN*2-1
, prisefac($i)
en$f
; si$i
est pair, ajoutez le terme à la somme$s
. imprimer la somme.J'aimerais avoir des nombres complexes (avec
M_I
comme unité imaginaire);Je voudrais simplement multiplier
$f
avecM_I*++$i
et enregistrer 7 octets.Peut-être que Mathematica peut le faire. Mais Mathematica n'est pas obligé.
Je pourrais enregistrer deux octets avec
cos(M_PI*$i/2)
au lieu de$i&1?:
et(-1)**$k++
;mais il serait un peu étrange d'utiliser un cosinus intégré pour construire une fonction cosinus.
la source
Axiome, 36 octets
Construisez l'infini (au sens fini mais on peut demander de construire la liste des 2 * n éléments si le PC a assez de mémoire) liste des sommes partielles pour la série Taylor pour cos (x) calculer en 'a', en "eval ( taylor (cos (x)), a) "; obtient l'élément 2 * n de cette liste dans ". (2 * n)". Cas de test:
la source
J , 17 octets
Essayez-le en ligne!
Utilise un intégré , qui je suppose est OK.
Malheureusement, je ne sais pas vraiment comment bien travailler avec des fonctions qui prennent des arguments via un curry comme celui-ci, j'ai donc dû le faire explicitement. Je suis sûr qu'il existe un moyen de le faire tacitement ou plus court.
la source
Nettoyer , 77 octets
Essayez-le en ligne!
la source