g | x | w | all
Bytes Lang Time Link
033Juby rbigdecimal/math rbigdecimal/util221212T183607ZJordan
068APLNARS231220T220009ZRosario
019MATL170804T153334ZLuis Men
188Zephyr250123T184846ZDLosc
093Maxima231222T081416Z138 Aspe
006Vyxal231220T063303Zemanresu
nan221212T203336Zbigyihsu
267Haskell211212T161011ZBenji
035PowerShell Core211212T202930ZJulian
047Pari/GP211209T113222Zalephalp
042Julia 1.0211209T110238ZMarcMush
019Wolfram Language Mathematica170804T230946ZZaMoC
030GNU bc l170804T182511ZDigital
066Factor + math.polynomials math.factorials210305T041555ZBubbler
084JavaScript Node.js200311T121502ZShieru A
055dzaima/APL200309T175021Zdzaima
054Pyth200309T160109ZCitty
174Axiom170805T074529Zuser5898
042Octave170804T212006ZSanchise
044Mathematica 44 Bytes170804T193537ZKelly Lo
041Perl 5170804T193341ZtheLambG
050PHP170804T175308ZAlex Nei
055R +Rmpfr170804T153840ZGiuseppe
046Mathics or Mathematica170804T160033Znotjagan
058Python 3170804T153302ZDennis

J-uby -rbigdecimal/math -rbigdecimal/util, 33 bytes

~:!~%(:& &~(:cos&BigMath))&0.to_d

Attempt This Online!

APL(NARS), 68 chars

r←D w;e;v;⎕FPC
⎕FPC+←4×w⋄e←÷10*w+v←1v
r←2○v⋄→3×⍳e>∣v-r⋄v←r⋄→2
r←w⍕r

//15+23+24+6=68

It seems that is possible approssimate the number c where cos(c)=c, with the succession {x_i} that is build in this way:

x_1=1 and x_(i+1)=cos(x_i), where lim_(i->+oo)x_i=c.

The D function is the one implement the succession, has argument the decimal precision where decimal precision is a positive integer number. ⎕FPC would be a local variable that not change outside the function D, it should represent the precision (in base 2) of the float calculations type'v' of number we run inside the D function. Because

Ndigits_base_2(Number)=1+⌊Ndigits_base_10(Number) x 3.32192809  

I choose the 4 in 4×w in D function, but in other functions that number could not be the right number, because this speach it seems not right, for some other problem.

Test:

   ⍪D¨⍳46
0.7                                              
0.73                                             
0.739                                            
0.7390                                           
0.73908                                          
0.739085                                         
0.7390851                                        
0.73908513                                       
0.739085133                                      
0.7390851332                                     
0.73908513321                                    
0.739085133215                                   
0.7390851332151                                  
0.73908513321516                                 
0.739085133215160                                
0.7390851332151606                               
0.73908513321516064                              
0.739085133215160641                             
0.7390851332151606416                            
0.73908513321516064165                           
0.739085133215160641655                          
0.7390851332151606416553                         
0.73908513321516064165531                        
0.739085133215160641655312                       
0.7390851332151606416553120                      
0.73908513321516064165531208                     
0.739085133215160641655312087                    
0.7390851332151606416553120876                   
0.73908513321516064165531208767                  
0.739085133215160641655312087673                 
0.7390851332151606416553120876738                
0.73908513321516064165531208767387               
0.739085133215160641655312087673873              
0.7390851332151606416553120876738734             
0.73908513321516064165531208767387340            
0.739085133215160641655312087673873404           
0.7390851332151606416553120876738734040          
0.73908513321516064165531208767387340401         
0.739085133215160641655312087673873404013        
0.7390851332151606416553120876738734040134       
0.73908513321516064165531208767387340401341      
0.739085133215160641655312087673873404013411     
0.7390851332151606416553120876738734040134117    
0.73908513321516064165531208767387340401341175   
0.739085133215160641655312087673873404013411758  
0.7390851332151606416553120876738734040134117589 

here no round at last digit?... possible i change the mode of print? Yes could be

  e←÷10*w+v←1v

It stop the number one digit more the digit It have to print. For 300 digits Dottie number:

  D 300    
0.7390851332151606416553120876738734040134117589007574649656806357
  7328465488354759459937610693176653184980124664398716302771490
  3691308420315780440574620778688524903891539289438845095234801
  3356312767722315809563537765724512043734199364335125384097800
  34340646700479402143478080271801883771136138204206631
  ⎕FPC
128

MATL, 34 30 19 bytes

11 bytes off thanks to Sanchises!

48i:"'cos('wh41hGY$

The last decimal figures in the output may be off. However, the number of correct figures starting from the left increases with the input, and the result converges to the actual constant.

Try it online!

Explanation

For input n, and starting at x=1, this applies the function

              x ↦ cos(x)

with n-digit variable-precision arithmetic n times.

48         % Push 48, which is ASCII for '1': initial value for x as a string
i:"        % Do n times, where n is the input
  'cos('   %   Push this string
  w        %   Swap. Moves current string x onto the top of the stack
  h        %   Concatenate
  41       %   Push 41, which is ASCII for ')'
  h        %   Concatenate. This gives the string 'cos(x)', where x is the
           %   current number
  GY$      %   Evaluate with variable-precision arithmetic using n digits
           %   The result is a string, which represents the new x
           % End (implicit). Display (implicit). The stack contains the last x

Zephyr, 188 bytes

input n as Integer
set x to 1
for i from 1to n
set c to 1
for j from 1to i
set t to 1
for k from 1to j
set t to((t*((-x)*x))/((2*k)-1))/(2*k)
next
set c to c+t
next
set x to c
next
print x

Outputs as a rational number, which gets unwieldy very fast. Try it online!

Uses the same Taylor series approach as Bubbler's Factor answer. x is the number on which the cosine approximation is repeatedly applied; each term of the series is calculated in t and then added to the running total to get the cosine approximation c. Because Zephyr doesn't have factorials or exponentials, we have to calculate them using a loop (the k loop).

Maxima, 93 bytes

A port of @MarcMush's Julia 1.0 answer in Maxima.

93 bytes, it can be golfed much more.


Golfed version. Try it online!

b(n):=block([o],o:fpprec,fpprec:n,r:if n<2 then bfloat(n)else bfloat(cos(b(n-1))),fpprec:o,r)

Ungolfed version. Try it online!

/* Define the recursive function with dynamic precision */
b(n) := block(
    [old_prec],
    /* Save the old precision */
    old_prec: fpprec,
    /* Set the precision relative to n */
    fpprec: n,
    /* Perform the calculation with the new precision */
    result: if n < 2 then bfloat(n) else bfloat(cos(b(n-1))),
    /* Restore the old precision */
    fpprec: old_prec,
    /* Return the result */
    result
);

/* Print the results from 1 to 1000 */
for i:1 thru 1000 do (
    print(b(i))
);

Vyxal, 6 bytes

(∆c)$Ḟ

Try it Online!

Uses sympy's arbitrary-precision cosine function. Since decimals are outputted to a fixed precision (although stored as arbitrary-precision) it has to be taken to n decimal places.

(  )   # n times
 ∆c    # cosine
    $Ḟ # result to n decimal places

Go, 71 bytes

import."math"
func f(n int)(k float64){for;n>=0;n--{k=Cos(k)}
return k}

Attempt This Online!

Input is the number of times to apply cos. Limited to 64-bit floating point precision.

Haskell, 267 bytes

f d=(iterate(\(b,e)->r(\(x,y)(z,w)->(x*10^(2*d-y)+z*10^(2*d-w),2*d))(0,0)$takeWhile((/=0).fst)[r(\(x,y)(z,w)->(x*z,y+w))((-1)^n,0)[let z=2*e*n;s=max(z-d)0in(b^(2*n)`div`10^s,z-s),(10^d`div`product[2..2*n],d)]|n<-[0..]])(7,1))#[];(h:t)#v|h`elem`v=h|0<1=t#(h:v);r=foldr

Try it online!

PowerShell Core, 35 bytes

1.."$args"|%{$x=[Math]::Cos($x)}
$x

Try it online!

Pari/GP, 47 bytes

f(n)=if(n,subst(Pol(cos(x+O(x^n))),x,f(n-1)),1)

Try it online!

Julia 1.0, 42 bytes

!n=big(n<2||setprecision(()->cos(!~-n),n))

Try it online!

sets the precision of BigFloats to n bits and computes \$cos^{n-1}(1)\$ recursively

Wolfram Language (Mathematica), 19 bytes

Nest[Cos,0,9#]~N~#&

Try it online!

-3 bytes from @alephalpha

GNU bc -l, 30

Score includes +1 for -l flag to bc.

for(a=1;a/A-b/A;b=c(a))a=b
a

The final newline is significant and necessary.

Try it online.

-l does 2 things:

I'm not really clear on the precision requirement. As it is, this program calculates to 20 decimal places. If a different precision is required, then scale=n; needs to be inserted at the start of the program, where n is the number of decimal places. I don't know if I should add this to my score or not.

Note also that for some numbers of decimal places (e.g. 21, but not 20), the calculation oscillates either side of the solution in the last digit. Thus in the comparison of current and previous iterations, I divide both sides by 10 (A) to erase the last digit.

Factor + math.polynomials math.factorials, 66 bytes

[| x | 1 x [ sq neg x [0,b) [ 2 * n! recip ] map polyval ] times ]

Try it online!

Factor has rational numbers, but no arbitrary-precision decimals. This answer tries to exploit it as much as possible: iterate the evaluation of the fist n terms of Taylor series (more precisely, Maclaurin series) n times, with the starting value of 1. The output is given as a rational number; the floating-point representation is also shown on TIO to check the value in human-readable form.

The function is very slow to calculate and very slow to converge, but in theory it must converge to the Dottie number as n increases, since the iterated function approaches the cosine function, the iteration count increases to infinity, and the whole computation is done in rationals (and therefore exact).

How it works

Given a positive integer \$n\$, the code approximates the Dottie number as follows:

$$ \cos{x} = \sum_{i=0}^{\infty}{\frac{(-1)^i}{(2i)!}x^{2i}} \approx \sum_{i=0}^{n-1}{\frac{(-x^2)^i}{(2i)!}} \\ \text{Dottie number } = \cos{x} \text{ iterated } \infty \text{ times on } 1 \\ \approx \sum_{i=0}^{n-1}{\frac{(-x^2)^i}{(2i)!}} \text{ iterated } n \text{ times on } 1 $$

[| x |  ! an anonymous function that takes one arg `x` as a local variable
  1 x [ ... ] times  ! repeat the inner function x times on the value 1...
    sq neg           !   val -> -val^2
    x [0,b)          !   0..x-1
    [ 2 * n! recip ] map  ! convert each number `i` to 1/(2i)!
    polyval          !   evaluate the array as polynomial at the value of -val^2
]

JavaScript (Node.js), 84 bytes

n=>"0."+(F=(J,Z=c=0n)=>J?F(J*-I*I/++c/++c/B/B,Z+J):I-Z>>2n?(I=Z,F(B)):I)(B=I=10n**n)

Try it online!

Has a precision of roughly n-1 digits. BigInt is used and cos(x) is calculated using its Taylor expansion. The I-Z>>2n part is used only to prevent looping forever (with a cost of 4 bytes and some precision). Although theoretical applicable for arbitrary precision, practical range is n<63 because of stack overflow.

Shorter (82 bytes), no worries about stack overflow, but far fewer precision

n=>"0."+eval("for(I=B=10n**n;n--;I=Z)for(Z=J=B,c=0n;J;)Z+=(J=J*-I*I/++c/++c/B/B)")

Much shorter (80 bytes), larger range until stack overflow (n<172), but same precision as the 82-byte.

n=>"0."+(F=(J,Z=c=0n)=>J?F(J*-I*I/++c/++c/B/B,Z+J):n--?(I=Z,F(B)):I)(B=I=10n**n)

If arbitrary precision is not the main point, then 25 bytes:

F=n=>n?Math.cos(F(n-1)):1

dzaima/APL, 55 bytes

⎕←⊃{⍵,⍨-/P,((P÷⍨×)/¨(2×⍳N)⍴¨⊃⍵)÷!2L×⍳N}⍣{⍵≢∪⍵}P←10L*N←⎕

Using big integer (no big decimals!) arithmetic (where \$10^N\$ is the equivalent of a 1), iterate the first \$N\$ terms of the Taylor series (an overestimate, but that's fine) until a duplicate has been encountered. May be off by a bit due to lost precision in the end, but, as with other answers, those differences will disappear with higher \$N\$.

No TIO link as TIO's dzaima/APL hasn't been updated to support bigintegers.

Example I/O:

1
9L

10
7390851332L

100
7390851332151606416553120876738734040134117589007574649656806357732846548835475945993761069317665318L

200
73908513321516064165531208767387340401341175890075746496568063577328465488354759459937610693176653184980124664398716302771490369130842031578044057462077868852490389153928943884509523480133563127677224L

Pyth, 57 54 bytes

u_.tG1lX$globals()$"neg"$__import__("decimal").Decimal

This would be much shorter if we didn't need the Decimal to be up to spec, but it is what it is.

Edit 1: -3 bytes because we need a number anyways, so we can use Xs returned copy of globals() length as our starting value, moving it to the end and removing a $ and some whitespace.

Try it online!

Axiom, 174 bytes

f(n:PI):Complex Float==(n>10^4=>%i;m:=digits(n+10);e:=10^(-n-7);a:=0;repeat(b:=a+(cos(a)-a)/(sin(a)+1.);if a~=0 and a-b<e then break;a:=b);a:=floor(b*10^n)/10.^n;digits(m);a)

ungolfed and commented

-- Input: n:PI numero di cifre
-- Output la soluzione x a cos(x)=x con n cifre significative dopo la virgola
-- Usa il metodo di Newton a_0:=a  a_(n+1)=a_n-f(a_n)/f'(a_n)
fo(n:PI):Complex Float==
  n>10^4=>%i
  m:=digits(n+10)
  e:=10^(-n-7)
  a:=0     -- Punto iniziale
  repeat
     b:=a+(cos(a)-a)/(sin(a)+1.)
     if a~=0 and a-b<e then break
     a:=b
  a:=floor(b*10^n)/10.^n
  digits(m)
  a

results:

(3) -> for i in 1..10 repeat output[i,f(i)]
   [1.0,0.7]
   [2.0,0.73]
   [3.0,0.739]
   [4.0,0.739]
   [5.0,0.73908]
   [6.0,0.739085]
   [7.0,0.7390851]
   [8.0,0.73908513]
   [9.0,0.739085133]
   [10.0,0.7390851332]
                                                               Type: Void
           Time: 0.12 (IN) + 0.10 (EV) + 0.12 (OT) + 0.02 (GC) = 0.35 sec
(4) -> f 300
   (4)
  0.7390851332 1516064165 5312087673 8734040134 1175890075 7464965680 635773284
  6 5488354759 4599376106 9317665318 4980124664 3987163027 7149036913 084203157
  8 0440574620 7786885249 0389153928 9438845095 2348013356 3127677223 158095635
  3 7765724512 0437341993 6433512538 4097800343 4064670047 9402143478 080271801
  8 8377113613 8204206631
                                                      Type: Complex Float
                                   Time: 0.03 (IN) + 0.07 (OT) = 0.10 sec

I would use the Newton method because it would be faster than 'repeated cos(x) method'

 800   92x
1000  153x
2000  379x

where in the first column there is the number of digit and in the second column there is how much Newton method is faster than use repeated cos(x) method, here. Good Morning

Octave, 42 bytes

@(n)digits(n)*0+vpasolve(sym('cos(x)-x'));

Try it online!

Pretty much a duplicate of my answer to Approximate the Plastic Number, but somewhat shorter due to more relaxed requirements.

Mathematica 44 Bytes

FindRoot[Cos@x-x,{x,0},WorkingPrecision->#]&

FindRoot uses Newton's method by default.

Perl 5, 41 Bytes

use bignum;sub f{$_[0]?cos(f($_[0]-1)):0}

Bignum is required for the arbitrary precision. Defines a function f that recursively applies cosine to 0 N times.

TIO doesn't seem to have bignum so no link :(

PHP, 50 bytes

$a=$argv[1];$i=$j=0;while($i<$a){$j=cos($j);$i++;}

Try it online!

R (+Rmpfr), 55 bytes

function(n,b=Rmpfr::mpfr(1,n)){for(i in 1:n)b=cos(b);b}

Dennis has now added Rmpfr to TIO so this will work; added some test cases.

Explanation:

Takes the code I wrote from this challenge to evaluate cos n times starting at 1, but first I specify the precision I want the values to be in by creating an object b of class mpfr with value 1 and precision n, n>=2, so we get more precision as we go along.

Try it online!

Mathics or Mathematica, 46 bytes

{$MaxPrecision=#}~Block~Cos~FixedPoint~N[1,#]&

Try it online!

Python 3, 58 bytes

lambda n:S('cos('*n+'0'+')'*n).evalf(n)
from sympy import*

Try it online!