mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
56 lines
1.6 KiB
Plaintext
56 lines
1.6 KiB
Plaintext
/*
|
|
* This file is part of the X10 project (http://x10-lang.org).
|
|
*
|
|
* This file is licensed to You under the Eclipse Public License (EPL);
|
|
* You may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
* http://www.opensource.org/licenses/eclipse-1.0.php
|
|
*
|
|
* (C) Copyright IBM Corporation 2006-2014.
|
|
*/
|
|
|
|
/**
|
|
* This is a slightly more realistic example of the
|
|
* basic computational pattern of using async/finish
|
|
* to express recursive divide-and-conquer algorithms.
|
|
* The program does integration via Guassian Quadrature.
|
|
* <p>
|
|
* It also can serve as an example of using a closure.
|
|
*/
|
|
public class Integrate {
|
|
static val epsilon = 1.0e-9;
|
|
|
|
val fun:(double)=>double;
|
|
|
|
public def this(f:(double)=>double) { fun = f; }
|
|
|
|
public def computeArea(left:double, right:double) {
|
|
return recEval(left, fun(left), right, fun(right), 0);
|
|
}
|
|
|
|
private def recEval(l:double, fl:double, r:double, fr:double, a:double) {
|
|
val h = (r - l) / 2;
|
|
val hh = h / 2;
|
|
val c = l + h;
|
|
val fc = fun(c);
|
|
val al = (fl + fc) * hh;
|
|
val ar = (fr + fc) * hh;
|
|
val alr = al + ar;
|
|
if (Math.abs(alr - a) < epsilon) return alr;
|
|
val expr1:double;
|
|
val expr2:double;
|
|
finish {
|
|
async { expr1 = recEval(c, fc, r, fr, ar); };
|
|
expr2 = recEval(l, fl, c, fc, al);
|
|
}
|
|
return expr1 + expr2;
|
|
}
|
|
|
|
public static def main(args:Rail[String]) {
|
|
val obj = new Integrate((x:double)=>(x*x + 1.0) * x);
|
|
val xMax = args.size > 0 ? Long.parse(args(0)) : 10;
|
|
val area = obj.computeArea(0, xMax);
|
|
Console.OUT.println("The area of (x*x +1) * x from 0 to "+xMax+" is "+area);
|
|
}
|
|
}
|