View Javadoc

1   /********************************************************************************
2    *
3    *	Copyright (C) 2008, 2009 Fujitsu Services Ltd.
4    *
5    *	Author: Nick Battle
6    *
7    *	This file is part of VDMJ.
8    *
9    *	VDMJ is free software: you can redistribute it and/or modify
10   *	it under the terms of the GNU General Public License as published by
11   *	the Free Software Foundation, either version 3 of the License, or
12   *	(at your option) any later version.
13   *
14   *	VDMJ is distributed in the hope that it will be useful,
15   *	but WITHOUT ANY WARRANTY; without even the implied warranty of
16   *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   *	GNU General Public License for more details.
18   *
19   *	You should have received a copy of the GNU General Public License
20   *	along with VDMJ.  If not, see <http://www.gnu.org/licenses/>.
21   *
22   ******************************************************************************/
23  
24  package org.overturetool.vdmj.util;
25  
26  import java.util.Random;
27  
28  import org.overturetool.vdmj.lex.LexNameToken;
29  import org.overturetool.vdmj.runtime.Context;
30  import org.overturetool.vdmj.runtime.ValueException;
31  import org.overturetool.vdmj.values.IntegerValue;
32  import org.overturetool.vdmj.values.RealValue;
33  import org.overturetool.vdmj.values.Value;
34  
35  public class MATH
36  {
37  	private static Random random = new Random();
38  	private static long seed = 0;
39  
40  	public static Value sin(Context ctxt) throws ValueException, Exception
41  	{
42  		Value arg = ctxt.lookup(new LexNameToken("MATH", "v", null));
43  		return new RealValue(Math.sin(arg.realValue(ctxt)));
44  	}
45  
46  	public static Value cos(Context ctxt) throws ValueException, Exception
47  	{
48  		Value arg = ctxt.lookup(new LexNameToken("MATH", "v", null));
49  		return new RealValue(Math.cos(arg.realValue(ctxt)));
50  	}
51  
52  	public static Value tan(Context ctxt) throws ValueException, Exception
53  	{
54  		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
55  		return new RealValue(Math.tan(arg.realValue(ctxt)));
56  	}
57  
58  	public static Value cot(Context ctxt) throws ValueException, Exception
59  	{
60  		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
61  		return new RealValue(1/Math.tan(arg.realValue(ctxt)));
62  	}
63  
64  	public static Value asin(Context ctxt) throws ValueException, Exception
65  	{
66  		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
67  		return new RealValue(Math.asin(arg.realValue(ctxt)));
68  	}
69  
70  	public static Value acos(Context ctxt) throws ValueException, Exception
71  	{
72  		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
73  		return new RealValue(Math.acos(arg.realValue(ctxt)));
74  	}
75  
76  	public static Value atan(Context ctxt) throws ValueException, Exception
77  	{
78  		Value arg = ctxt.lookup(new LexNameToken("MATH", "v", null));
79  		return new RealValue(Math.atan(arg.realValue(ctxt)));
80  	}
81  
82  	public static Value sqrt(Context ctxt) throws ValueException, Exception
83  	{
84  		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
85  		return new RealValue(Math.sqrt(arg.realValue(ctxt)));
86  	}
87  
88  	public static Value pi(@SuppressWarnings("unused") Context ctxt)
89  		throws Exception
90  	{
91  		return new RealValue(Math.PI);
92  	}
93  
94  	public static Value rand(Context ctxt) throws ValueException
95  	{
96  		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
97  		long lv = arg.intValue(ctxt);
98  
99  		if (seed == 0)
100 		{
101 			return new IntegerValue(lv);
102 		}
103 		else
104 		{
105 			return new IntegerValue(random.nextLong() % lv);
106 		}
107 	}
108 
109 	public static Value srand2(Context ctxt) throws ValueException
110 	{
111 		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
112 		seed = arg.intValue(ctxt);
113 		random.setSeed(seed);
114 		return new IntegerValue(seed);
115 	}
116 
117 	public static Value exp(Context ctxt) throws ValueException, Exception
118 	{
119 		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
120 		return new RealValue(Math.exp(arg.realValue(ctxt)));
121 	}
122 
123 	public static Value ln(Context ctxt) throws ValueException, Exception
124 	{
125 		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
126 		return new RealValue(Math.log(arg.realValue(ctxt)));
127 	}
128 
129 	public static Value log(Context ctxt) throws ValueException, Exception
130 	{
131 		Value arg = ctxt.lookup(new LexNameToken("MATH", "a", null));
132 		return new RealValue(Math.log10(arg.realValue(ctxt)));
133 	}
134 }