@@ -13,13 +13,15 @@ package mathlib {
1313
1414 static attribute iz : int;
1515
16+ static attribute defaultTolerance : double;
17+
1618 static attribute hexdigit : Sequence(String);
1719
1820 static operation initialiseMathLib() : void
1921 pre: true
2022 post: true
2123 activity:
22- (MathLib.hexdigit := Sequence{ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" } ; MathLib.setSeeds(1001, 781, 913) );
24+ (MathLib.hexdigit := Sequence{ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F" } ; MathLib.setSeeds(1001, 781, 913) ; MathLib.defaultTolerance := 0.001 );
2325
2426 static query pi() : double
2527 pre: true
@@ -29,6 +31,10 @@ package mathlib {
2931 pre: true
3032 post: result = 3.14159265;
3133
34+ static query e() : double
35+ pre: true
36+ post: result = 1->exp();
37+
3238 static query eValue() : double
3339 pre: true
3440 post: result = 1->exp();
@@ -269,8 +275,8 @@ package mathlib {
269275 post: m = MathLib.mean(sq) & result = ( sq->collect( x | (x - m)->sqr() )->sum() ) / ( sq->size() );
270276
271277 static query standardDeviation(sq : Sequence(double)) : double
272- pre: sq->size() > 0
273- post: m = MathLib.variance (sq) & result = m ->sqrt();
278+ pre: true
279+ post: (sq->size() = 0 => result = 0) & (sq->size() > 0 => result = MathLib.variance(sq) ->sqrt() );
274280
275281 static query lcm(x : int, y : int) : int
276282 pre: true
@@ -296,13 +302,13 @@ package mathlib {
296302 static query differential(f : Function(double,double)) : Function(double,double)
297303 pre: true
298304 post:
299- result = lambda x : double in (500* (f->apply(x+0.001 ) - f->apply(x-0.001 )));
305+ result = lambda x : double in ((1.0/(2.0*MathLib.defaultTolerance))* (f->apply(x+MathLib.defaultTolerance ) - f->apply(x-MathLib.defaultTolerance )));
300306
301307 static query definiteIntegral(st : double , en : double , f : Function(double,double) ) : double
302308 pre: true
303309 post: true
304310 activity:
305- var tol : double := 0.001 ;
311+ var tol : double := MathLib.defaultTolerance ;
306312 var area : double := 0.0;
307313 var d : double := tol*(en - st);
308314 var cum : double := st;
@@ -347,7 +353,7 @@ package mathlib {
347353 static query irrDiscrete(values: Sequence(double)) : double
348354 pre: true post: true;
349355
350- static query straddleDate (d1 : OclDate, d2 : OclDate, period : int) : Sequence(OclDate)
356+ static query straddleDates (d1 : OclDate, d2 : OclDate, period : int) : Sequence(OclDate)
351357 pre: true
352358 post: true
353359 activity:
@@ -357,6 +363,16 @@ package mathlib {
357363 (cd := cd.addMonthYMD(period));
358364 return Sequence{cd.subtractMonthYMD(period),cd};
359365
366+ static query numberOfPeriods(settle : OclDate, matur : OclDate, period : int) : int
367+ pre: true
368+ post: (monthsToMaturity = OclDate.differenceMonths(matur,settle)*1.0 => result = (monthsToMaturity/period)->ceil());
369+
370+ static query sequenceOfPeriods(sett : OclDate, mat : OclDate, period : int) : Sequence(int)
371+ pre: true
372+ post:
373+ (numPeriods = FinanceLib.numberOfPeriods(sett, mat, period) =>
374+ result = Integer.subrange(1, numPeriods));
375+
360376 }
361377
362378}
0 commit comments