Continued fraction: Difference between revisions
Content added Content deleted
Line 611: | Line 611: | ||
=={{header|Scala}}== |
=={{header|Scala}}== |
||
{{works with|Scala|2.9.1}} |
{{works with|Scala|2.9.1}} |
||
<lang Scala> |
|||
<lang Scala>object CF extends App { |
|||
import Stream._ |
|||
val sqrt2 = 1 #:: from(2,0) zip from(1,0) |
|||
val napier = 2 #:: from(1) zip (1 #:: from(1)) |
|||
val pi = 3 #:: from(6,0) zip (from(1,2) map {x=>x*x}) |
|||
// reference values, source: wikipedia |
|||
val refPi = "3.14159265358979323846264338327950288419716939937510" |
|||
val refNapier = "2.71828182845904523536028747135266249775724709369995" |
|||
val refSQRT2 = "1.41421356237309504880168872420969807856967187537694" |
|||
def calc(cf: Stream[(Int, Int)], numberOfIters: Int=200): BigDecimal = { |
|||
(cf take numberOfIters toList).foldRight[BigDecimal](1)((a, z) => a._1+a._2/z) |
|||
} |
|||
def approx(cfV: BigDecimal, cfRefV: String): String = { |
|||
val p: Pair[Char,Char] => Boolean = pair =>(pair._1==pair._2) |
|||
((cfV.toString+" "*34).substring(0,34) zip cfRefV.toString.substring(0,34)).takeWhile(p).foldRight[String]("")((a:Pair[Char,Char],z)=>a._1+z) |
|||
} |
|||
List(("sqrt2",sqrt2,50,refSQRT2),("napier",napier,50,refNapier),("pi",pi,3000,refPi)) foreach {t=> |
|||
val (name,cf,iters,refV) = t |
|||
val cfV = calc(cf,iters) |
|||
println(name+":") |
|||
println("ref value: "+refV.substring(0,34)) |
|||
println("cf value: "+(cfV.toString+" "*34).substring(0,34)) |
|||
println("precision: "+approx(cfV,refV)) |
|||
println() |
|||
} |
|||
} |
|||
</lang> |
</lang> |
||
Output: |
Output: |
||
<pre> |
<pre>sqrt2: |
||
ref value: 1.41421356237309504880168872420969 |
|||
</pre> |
|||
cf value: 1.41421356237309504880168872420969 |
|||
precision: 1.41421356237309504880168872420969 |
|||
napier: |
|||
ref value: 2.71828182845904523536028747135266 |
|||
cf value: 2.71828182845904523536028747135266 |
|||
precision: 2.71828182845904523536028747135266 |
|||
pi: |
|||
ref value: 3.14159265358979323846264338327950 |
|||
cf value: 3.14159265358052780404906362935452 |
|||
precision: 3.14159265358</pre> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |