Do the auto-super-logarithm
Haskell, 55 54 52 bytes
s n=[x|x<-[2,1.9999..],n>iterate(x**)1!!floor n]!!0
Usage:
> s 100
1.445600000000061
Thanks to @nimi for 1 byte!
Thanks to @xnor for 2!
Javascript, ES6: 77 bytes / ES7: 57 53 bytes
ES6
n=>eval("for(x=n,s='x';--x;s=`Math.pow(x,${s})`);for(x=2;eval(s)>n;)x-=.001")
ES7
Using **
as suggested by DanTheMan:
n=>eval("for(x=2;eval('x**'.repeat(n)+1)>n;)x-=.001")
Example
let f =
n=>eval("for(x=n,s='x';--x;s=`Math.pow(x,${s})`);for(x=2;eval(s)>n;)x-=.001")
console.log(f(25));
J, 39 31 28 bytes
(>./@(]*[>^/@#"0)1+i.%])&1e4
Based on the reference implementation. It is only accurate to three decimal places.
Saved 8 bytes using the method from @Adám's solution.
Usage
Extra commands used to format multiple input/output.
f =: (>./@(]*[>^/@#"0)1+i.%])&1e4
(,.f"0) 1 3 6 10 25 50 100
1 0
3 1.635
6 1.5686
10 1.5084
25 1.4585
50 1.4485
100 1.4456
f 1000
1.4446
Explanation
(>./@(]*[>^/@#"0)1+i.%])&1e4 Input: n
1e4 The constant 10000
( ) Operate on n (LHS) and 10000 (RHS)
i. The range [0, 10000)
] Get (RHS) 10000
% Divide each in the range by 10000
1+ Add 1 to each
( ) Operate on n (LHS) and the range (RHS)
#"0 For each in the range, create a list of n copies
^/@ Reduce each list of copies using exponentation
J parses from right-to-left which makes this
equivalent to the tetration
[ Get n
> Test if each value is less than n
] Get the initial range
* Multiply elementwise
>./@ Reduce using max and return