comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/fraction/Fraction.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> package org.apache.commons.math.fraction;<a name="line.17"></a>
21 <FONT color="green">018</FONT> <a name="line.18"></a>
22 <FONT color="green">019</FONT> import java.io.Serializable;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.math.BigInteger;<a name="line.20"></a>
24 <FONT color="green">021</FONT> <a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.FieldElement;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.23"></a>
27 <FONT color="green">024</FONT> import org.apache.commons.math.util.MathUtils;<a name="line.24"></a>
28 <FONT color="green">025</FONT> <a name="line.25"></a>
29 <FONT color="green">026</FONT> /**<a name="line.26"></a>
30 <FONT color="green">027</FONT> * Representation of a rational number.<a name="line.27"></a>
31 <FONT color="green">028</FONT> *<a name="line.28"></a>
32 <FONT color="green">029</FONT> * implements Serializable since 2.0<a name="line.29"></a>
33 <FONT color="green">030</FONT> *<a name="line.30"></a>
34 <FONT color="green">031</FONT> * @since 1.1<a name="line.31"></a>
35 <FONT color="green">032</FONT> * @version $Revision: 922715 $ $Date: 2010-03-13 20:38:14 -0500 (Sat, 13 Mar 2010) $<a name="line.32"></a>
36 <FONT color="green">033</FONT> */<a name="line.33"></a>
37 <FONT color="green">034</FONT> public class Fraction<a name="line.34"></a>
38 <FONT color="green">035</FONT> extends Number<a name="line.35"></a>
39 <FONT color="green">036</FONT> implements FieldElement&lt;Fraction&gt;, Comparable&lt;Fraction&gt;, Serializable {<a name="line.36"></a>
40 <FONT color="green">037</FONT> <a name="line.37"></a>
41 <FONT color="green">038</FONT> /** A fraction representing "2 / 1". */<a name="line.38"></a>
42 <FONT color="green">039</FONT> public static final Fraction TWO = new Fraction(2, 1);<a name="line.39"></a>
43 <FONT color="green">040</FONT> <a name="line.40"></a>
44 <FONT color="green">041</FONT> /** A fraction representing "1". */<a name="line.41"></a>
45 <FONT color="green">042</FONT> public static final Fraction ONE = new Fraction(1, 1);<a name="line.42"></a>
46 <FONT color="green">043</FONT> <a name="line.43"></a>
47 <FONT color="green">044</FONT> /** A fraction representing "0". */<a name="line.44"></a>
48 <FONT color="green">045</FONT> public static final Fraction ZERO = new Fraction(0, 1);<a name="line.45"></a>
49 <FONT color="green">046</FONT> <a name="line.46"></a>
50 <FONT color="green">047</FONT> /** A fraction representing "4/5". */<a name="line.47"></a>
51 <FONT color="green">048</FONT> public static final Fraction FOUR_FIFTHS = new Fraction(4, 5);<a name="line.48"></a>
52 <FONT color="green">049</FONT> <a name="line.49"></a>
53 <FONT color="green">050</FONT> /** A fraction representing "1/5". */<a name="line.50"></a>
54 <FONT color="green">051</FONT> public static final Fraction ONE_FIFTH = new Fraction(1, 5);<a name="line.51"></a>
55 <FONT color="green">052</FONT> <a name="line.52"></a>
56 <FONT color="green">053</FONT> /** A fraction representing "1/2". */<a name="line.53"></a>
57 <FONT color="green">054</FONT> public static final Fraction ONE_HALF = new Fraction(1, 2);<a name="line.54"></a>
58 <FONT color="green">055</FONT> <a name="line.55"></a>
59 <FONT color="green">056</FONT> /** A fraction representing "1/4". */<a name="line.56"></a>
60 <FONT color="green">057</FONT> public static final Fraction ONE_QUARTER = new Fraction(1, 4);<a name="line.57"></a>
61 <FONT color="green">058</FONT> <a name="line.58"></a>
62 <FONT color="green">059</FONT> /** A fraction representing "1/3". */<a name="line.59"></a>
63 <FONT color="green">060</FONT> public static final Fraction ONE_THIRD = new Fraction(1, 3);<a name="line.60"></a>
64 <FONT color="green">061</FONT> <a name="line.61"></a>
65 <FONT color="green">062</FONT> /** A fraction representing "3/5". */<a name="line.62"></a>
66 <FONT color="green">063</FONT> public static final Fraction THREE_FIFTHS = new Fraction(3, 5);<a name="line.63"></a>
67 <FONT color="green">064</FONT> <a name="line.64"></a>
68 <FONT color="green">065</FONT> /** A fraction representing "3/4". */<a name="line.65"></a>
69 <FONT color="green">066</FONT> public static final Fraction THREE_QUARTERS = new Fraction(3, 4);<a name="line.66"></a>
70 <FONT color="green">067</FONT> <a name="line.67"></a>
71 <FONT color="green">068</FONT> /** A fraction representing "2/5". */<a name="line.68"></a>
72 <FONT color="green">069</FONT> public static final Fraction TWO_FIFTHS = new Fraction(2, 5);<a name="line.69"></a>
73 <FONT color="green">070</FONT> <a name="line.70"></a>
74 <FONT color="green">071</FONT> /** A fraction representing "2/4". */<a name="line.71"></a>
75 <FONT color="green">072</FONT> public static final Fraction TWO_QUARTERS = new Fraction(2, 4);<a name="line.72"></a>
76 <FONT color="green">073</FONT> <a name="line.73"></a>
77 <FONT color="green">074</FONT> /** A fraction representing "2/3". */<a name="line.74"></a>
78 <FONT color="green">075</FONT> public static final Fraction TWO_THIRDS = new Fraction(2, 3);<a name="line.75"></a>
79 <FONT color="green">076</FONT> <a name="line.76"></a>
80 <FONT color="green">077</FONT> /** A fraction representing "-1 / 1". */<a name="line.77"></a>
81 <FONT color="green">078</FONT> public static final Fraction MINUS_ONE = new Fraction(-1, 1);<a name="line.78"></a>
82 <FONT color="green">079</FONT> <a name="line.79"></a>
83 <FONT color="green">080</FONT> /** Message for zero denominator. */<a name="line.80"></a>
84 <FONT color="green">081</FONT> private static final String ZERO_DENOMINATOR_MESSAGE =<a name="line.81"></a>
85 <FONT color="green">082</FONT> "zero denominator in fraction {0}/{1}";<a name="line.82"></a>
86 <FONT color="green">083</FONT> <a name="line.83"></a>
87 <FONT color="green">084</FONT> /** Message for overflow. */<a name="line.84"></a>
88 <FONT color="green">085</FONT> private static final String OVERFLOW_MESSAGE =<a name="line.85"></a>
89 <FONT color="green">086</FONT> "overflow in fraction {0}/{1}, cannot negate";<a name="line.86"></a>
90 <FONT color="green">087</FONT> <a name="line.87"></a>
91 <FONT color="green">088</FONT> /** Message for null fraction. */<a name="line.88"></a>
92 <FONT color="green">089</FONT> private static final String NULL_FRACTION =<a name="line.89"></a>
93 <FONT color="green">090</FONT> "null fraction";<a name="line.90"></a>
94 <FONT color="green">091</FONT> <a name="line.91"></a>
95 <FONT color="green">092</FONT> /** Serializable version identifier */<a name="line.92"></a>
96 <FONT color="green">093</FONT> private static final long serialVersionUID = 3698073679419233275L;<a name="line.93"></a>
97 <FONT color="green">094</FONT> <a name="line.94"></a>
98 <FONT color="green">095</FONT> /** The denominator. */<a name="line.95"></a>
99 <FONT color="green">096</FONT> private final int denominator;<a name="line.96"></a>
100 <FONT color="green">097</FONT> <a name="line.97"></a>
101 <FONT color="green">098</FONT> /** The numerator. */<a name="line.98"></a>
102 <FONT color="green">099</FONT> private final int numerator;<a name="line.99"></a>
103 <FONT color="green">100</FONT> <a name="line.100"></a>
104 <FONT color="green">101</FONT> /**<a name="line.101"></a>
105 <FONT color="green">102</FONT> * Create a fraction given the double value.<a name="line.102"></a>
106 <FONT color="green">103</FONT> * @param value the double value to convert to a fraction.<a name="line.103"></a>
107 <FONT color="green">104</FONT> * @throws FractionConversionException if the continued fraction failed to<a name="line.104"></a>
108 <FONT color="green">105</FONT> * converge.<a name="line.105"></a>
109 <FONT color="green">106</FONT> */<a name="line.106"></a>
110 <FONT color="green">107</FONT> public Fraction(double value) throws FractionConversionException {<a name="line.107"></a>
111 <FONT color="green">108</FONT> this(value, 1.0e-5, 100);<a name="line.108"></a>
112 <FONT color="green">109</FONT> }<a name="line.109"></a>
113 <FONT color="green">110</FONT> <a name="line.110"></a>
114 <FONT color="green">111</FONT> /**<a name="line.111"></a>
115 <FONT color="green">112</FONT> * Create a fraction given the double value and maximum error allowed.<a name="line.112"></a>
116 <FONT color="green">113</FONT> * &lt;p&gt;<a name="line.113"></a>
117 <FONT color="green">114</FONT> * References:<a name="line.114"></a>
118 <FONT color="green">115</FONT> * &lt;ul&gt;<a name="line.115"></a>
119 <FONT color="green">116</FONT> * &lt;li&gt;&lt;a href="http://mathworld.wolfram.com/ContinuedFraction.html"&gt;<a name="line.116"></a>
120 <FONT color="green">117</FONT> * Continued Fraction&lt;/a&gt; equations (11) and (22)-(26)&lt;/li&gt;<a name="line.117"></a>
121 <FONT color="green">118</FONT> * &lt;/ul&gt;<a name="line.118"></a>
122 <FONT color="green">119</FONT> * &lt;/p&gt;<a name="line.119"></a>
123 <FONT color="green">120</FONT> * @param value the double value to convert to a fraction.<a name="line.120"></a>
124 <FONT color="green">121</FONT> * @param epsilon maximum error allowed. The resulting fraction is within<a name="line.121"></a>
125 <FONT color="green">122</FONT> * &lt;code&gt;epsilon&lt;/code&gt; of &lt;code&gt;value&lt;/code&gt;, in absolute terms.<a name="line.122"></a>
126 <FONT color="green">123</FONT> * @param maxIterations maximum number of convergents<a name="line.123"></a>
127 <FONT color="green">124</FONT> * @throws FractionConversionException if the continued fraction failed to<a name="line.124"></a>
128 <FONT color="green">125</FONT> * converge.<a name="line.125"></a>
129 <FONT color="green">126</FONT> */<a name="line.126"></a>
130 <FONT color="green">127</FONT> public Fraction(double value, double epsilon, int maxIterations)<a name="line.127"></a>
131 <FONT color="green">128</FONT> throws FractionConversionException<a name="line.128"></a>
132 <FONT color="green">129</FONT> {<a name="line.129"></a>
133 <FONT color="green">130</FONT> this(value, epsilon, Integer.MAX_VALUE, maxIterations);<a name="line.130"></a>
134 <FONT color="green">131</FONT> }<a name="line.131"></a>
135 <FONT color="green">132</FONT> <a name="line.132"></a>
136 <FONT color="green">133</FONT> /**<a name="line.133"></a>
137 <FONT color="green">134</FONT> * Create a fraction given the double value and maximum denominator.<a name="line.134"></a>
138 <FONT color="green">135</FONT> * &lt;p&gt;<a name="line.135"></a>
139 <FONT color="green">136</FONT> * References:<a name="line.136"></a>
140 <FONT color="green">137</FONT> * &lt;ul&gt;<a name="line.137"></a>
141 <FONT color="green">138</FONT> * &lt;li&gt;&lt;a href="http://mathworld.wolfram.com/ContinuedFraction.html"&gt;<a name="line.138"></a>
142 <FONT color="green">139</FONT> * Continued Fraction&lt;/a&gt; equations (11) and (22)-(26)&lt;/li&gt;<a name="line.139"></a>
143 <FONT color="green">140</FONT> * &lt;/ul&gt;<a name="line.140"></a>
144 <FONT color="green">141</FONT> * &lt;/p&gt;<a name="line.141"></a>
145 <FONT color="green">142</FONT> * @param value the double value to convert to a fraction.<a name="line.142"></a>
146 <FONT color="green">143</FONT> * @param maxDenominator The maximum allowed value for denominator<a name="line.143"></a>
147 <FONT color="green">144</FONT> * @throws FractionConversionException if the continued fraction failed to<a name="line.144"></a>
148 <FONT color="green">145</FONT> * converge<a name="line.145"></a>
149 <FONT color="green">146</FONT> */<a name="line.146"></a>
150 <FONT color="green">147</FONT> public Fraction(double value, int maxDenominator)<a name="line.147"></a>
151 <FONT color="green">148</FONT> throws FractionConversionException<a name="line.148"></a>
152 <FONT color="green">149</FONT> {<a name="line.149"></a>
153 <FONT color="green">150</FONT> this(value, 0, maxDenominator, 100);<a name="line.150"></a>
154 <FONT color="green">151</FONT> }<a name="line.151"></a>
155 <FONT color="green">152</FONT> <a name="line.152"></a>
156 <FONT color="green">153</FONT> /**<a name="line.153"></a>
157 <FONT color="green">154</FONT> * Create a fraction given the double value and either the maximum error<a name="line.154"></a>
158 <FONT color="green">155</FONT> * allowed or the maximum number of denominator digits.<a name="line.155"></a>
159 <FONT color="green">156</FONT> * &lt;p&gt;<a name="line.156"></a>
160 <FONT color="green">157</FONT> *<a name="line.157"></a>
161 <FONT color="green">158</FONT> * NOTE: This constructor is called with EITHER<a name="line.158"></a>
162 <FONT color="green">159</FONT> * - a valid epsilon value and the maxDenominator set to Integer.MAX_VALUE<a name="line.159"></a>
163 <FONT color="green">160</FONT> * (that way the maxDenominator has no effect).<a name="line.160"></a>
164 <FONT color="green">161</FONT> * OR<a name="line.161"></a>
165 <FONT color="green">162</FONT> * - a valid maxDenominator value and the epsilon value set to zero<a name="line.162"></a>
166 <FONT color="green">163</FONT> * (that way epsilon only has effect if there is an exact match before<a name="line.163"></a>
167 <FONT color="green">164</FONT> * the maxDenominator value is reached).<a name="line.164"></a>
168 <FONT color="green">165</FONT> * &lt;/p&gt;&lt;p&gt;<a name="line.165"></a>
169 <FONT color="green">166</FONT> *<a name="line.166"></a>
170 <FONT color="green">167</FONT> * It has been done this way so that the same code can be (re)used for both<a name="line.167"></a>
171 <FONT color="green">168</FONT> * scenarios. However this could be confusing to users if it were part of<a name="line.168"></a>
172 <FONT color="green">169</FONT> * the public API and this constructor should therefore remain PRIVATE.<a name="line.169"></a>
173 <FONT color="green">170</FONT> * &lt;/p&gt;<a name="line.170"></a>
174 <FONT color="green">171</FONT> *<a name="line.171"></a>
175 <FONT color="green">172</FONT> * See JIRA issue ticket MATH-181 for more details:<a name="line.172"></a>
176 <FONT color="green">173</FONT> *<a name="line.173"></a>
177 <FONT color="green">174</FONT> * https://issues.apache.org/jira/browse/MATH-181<a name="line.174"></a>
178 <FONT color="green">175</FONT> *<a name="line.175"></a>
179 <FONT color="green">176</FONT> * @param value the double value to convert to a fraction.<a name="line.176"></a>
180 <FONT color="green">177</FONT> * @param epsilon maximum error allowed. The resulting fraction is within<a name="line.177"></a>
181 <FONT color="green">178</FONT> * &lt;code&gt;epsilon&lt;/code&gt; of &lt;code&gt;value&lt;/code&gt;, in absolute terms.<a name="line.178"></a>
182 <FONT color="green">179</FONT> * @param maxDenominator maximum denominator value allowed.<a name="line.179"></a>
183 <FONT color="green">180</FONT> * @param maxIterations maximum number of convergents<a name="line.180"></a>
184 <FONT color="green">181</FONT> * @throws FractionConversionException if the continued fraction failed to<a name="line.181"></a>
185 <FONT color="green">182</FONT> * converge.<a name="line.182"></a>
186 <FONT color="green">183</FONT> */<a name="line.183"></a>
187 <FONT color="green">184</FONT> private Fraction(double value, double epsilon, int maxDenominator, int maxIterations)<a name="line.184"></a>
188 <FONT color="green">185</FONT> throws FractionConversionException<a name="line.185"></a>
189 <FONT color="green">186</FONT> {<a name="line.186"></a>
190 <FONT color="green">187</FONT> long overflow = Integer.MAX_VALUE;<a name="line.187"></a>
191 <FONT color="green">188</FONT> double r0 = value;<a name="line.188"></a>
192 <FONT color="green">189</FONT> long a0 = (long)Math.floor(r0);<a name="line.189"></a>
193 <FONT color="green">190</FONT> if (a0 &gt; overflow) {<a name="line.190"></a>
194 <FONT color="green">191</FONT> throw new FractionConversionException(value, a0, 1l);<a name="line.191"></a>
195 <FONT color="green">192</FONT> }<a name="line.192"></a>
196 <FONT color="green">193</FONT> <a name="line.193"></a>
197 <FONT color="green">194</FONT> // check for (almost) integer arguments, which should not go<a name="line.194"></a>
198 <FONT color="green">195</FONT> // to iterations.<a name="line.195"></a>
199 <FONT color="green">196</FONT> if (Math.abs(a0 - value) &lt; epsilon) {<a name="line.196"></a>
200 <FONT color="green">197</FONT> this.numerator = (int) a0;<a name="line.197"></a>
201 <FONT color="green">198</FONT> this.denominator = 1;<a name="line.198"></a>
202 <FONT color="green">199</FONT> return;<a name="line.199"></a>
203 <FONT color="green">200</FONT> }<a name="line.200"></a>
204 <FONT color="green">201</FONT> <a name="line.201"></a>
205 <FONT color="green">202</FONT> long p0 = 1;<a name="line.202"></a>
206 <FONT color="green">203</FONT> long q0 = 0;<a name="line.203"></a>
207 <FONT color="green">204</FONT> long p1 = a0;<a name="line.204"></a>
208 <FONT color="green">205</FONT> long q1 = 1;<a name="line.205"></a>
209 <FONT color="green">206</FONT> <a name="line.206"></a>
210 <FONT color="green">207</FONT> long p2 = 0;<a name="line.207"></a>
211 <FONT color="green">208</FONT> long q2 = 1;<a name="line.208"></a>
212 <FONT color="green">209</FONT> <a name="line.209"></a>
213 <FONT color="green">210</FONT> int n = 0;<a name="line.210"></a>
214 <FONT color="green">211</FONT> boolean stop = false;<a name="line.211"></a>
215 <FONT color="green">212</FONT> do {<a name="line.212"></a>
216 <FONT color="green">213</FONT> ++n;<a name="line.213"></a>
217 <FONT color="green">214</FONT> double r1 = 1.0 / (r0 - a0);<a name="line.214"></a>
218 <FONT color="green">215</FONT> long a1 = (long)Math.floor(r1);<a name="line.215"></a>
219 <FONT color="green">216</FONT> p2 = (a1 * p1) + p0;<a name="line.216"></a>
220 <FONT color="green">217</FONT> q2 = (a1 * q1) + q0;<a name="line.217"></a>
221 <FONT color="green">218</FONT> if ((p2 &gt; overflow) || (q2 &gt; overflow)) {<a name="line.218"></a>
222 <FONT color="green">219</FONT> throw new FractionConversionException(value, p2, q2);<a name="line.219"></a>
223 <FONT color="green">220</FONT> }<a name="line.220"></a>
224 <FONT color="green">221</FONT> <a name="line.221"></a>
225 <FONT color="green">222</FONT> double convergent = (double)p2 / (double)q2;<a name="line.222"></a>
226 <FONT color="green">223</FONT> if (n &lt; maxIterations &amp;&amp; Math.abs(convergent - value) &gt; epsilon &amp;&amp; q2 &lt; maxDenominator) {<a name="line.223"></a>
227 <FONT color="green">224</FONT> p0 = p1;<a name="line.224"></a>
228 <FONT color="green">225</FONT> p1 = p2;<a name="line.225"></a>
229 <FONT color="green">226</FONT> q0 = q1;<a name="line.226"></a>
230 <FONT color="green">227</FONT> q1 = q2;<a name="line.227"></a>
231 <FONT color="green">228</FONT> a0 = a1;<a name="line.228"></a>
232 <FONT color="green">229</FONT> r0 = r1;<a name="line.229"></a>
233 <FONT color="green">230</FONT> } else {<a name="line.230"></a>
234 <FONT color="green">231</FONT> stop = true;<a name="line.231"></a>
235 <FONT color="green">232</FONT> }<a name="line.232"></a>
236 <FONT color="green">233</FONT> } while (!stop);<a name="line.233"></a>
237 <FONT color="green">234</FONT> <a name="line.234"></a>
238 <FONT color="green">235</FONT> if (n &gt;= maxIterations) {<a name="line.235"></a>
239 <FONT color="green">236</FONT> throw new FractionConversionException(value, maxIterations);<a name="line.236"></a>
240 <FONT color="green">237</FONT> }<a name="line.237"></a>
241 <FONT color="green">238</FONT> <a name="line.238"></a>
242 <FONT color="green">239</FONT> if (q2 &lt; maxDenominator) {<a name="line.239"></a>
243 <FONT color="green">240</FONT> this.numerator = (int) p2;<a name="line.240"></a>
244 <FONT color="green">241</FONT> this.denominator = (int) q2;<a name="line.241"></a>
245 <FONT color="green">242</FONT> } else {<a name="line.242"></a>
246 <FONT color="green">243</FONT> this.numerator = (int) p1;<a name="line.243"></a>
247 <FONT color="green">244</FONT> this.denominator = (int) q1;<a name="line.244"></a>
248 <FONT color="green">245</FONT> }<a name="line.245"></a>
249 <FONT color="green">246</FONT> <a name="line.246"></a>
250 <FONT color="green">247</FONT> }<a name="line.247"></a>
251 <FONT color="green">248</FONT> <a name="line.248"></a>
252 <FONT color="green">249</FONT> /**<a name="line.249"></a>
253 <FONT color="green">250</FONT> * Create a fraction from an int.<a name="line.250"></a>
254 <FONT color="green">251</FONT> * The fraction is num / 1.<a name="line.251"></a>
255 <FONT color="green">252</FONT> * @param num the numerator.<a name="line.252"></a>
256 <FONT color="green">253</FONT> */<a name="line.253"></a>
257 <FONT color="green">254</FONT> public Fraction(int num) {<a name="line.254"></a>
258 <FONT color="green">255</FONT> this(num, 1);<a name="line.255"></a>
259 <FONT color="green">256</FONT> }<a name="line.256"></a>
260 <FONT color="green">257</FONT> <a name="line.257"></a>
261 <FONT color="green">258</FONT> /**<a name="line.258"></a>
262 <FONT color="green">259</FONT> * Create a fraction given the numerator and denominator. The fraction is<a name="line.259"></a>
263 <FONT color="green">260</FONT> * reduced to lowest terms.<a name="line.260"></a>
264 <FONT color="green">261</FONT> * @param num the numerator.<a name="line.261"></a>
265 <FONT color="green">262</FONT> * @param den the denominator.<a name="line.262"></a>
266 <FONT color="green">263</FONT> * @throws ArithmeticException if the denominator is &lt;code&gt;zero&lt;/code&gt;<a name="line.263"></a>
267 <FONT color="green">264</FONT> */<a name="line.264"></a>
268 <FONT color="green">265</FONT> public Fraction(int num, int den) {<a name="line.265"></a>
269 <FONT color="green">266</FONT> if (den == 0) {<a name="line.266"></a>
270 <FONT color="green">267</FONT> throw MathRuntimeException.createArithmeticException(<a name="line.267"></a>
271 <FONT color="green">268</FONT> ZERO_DENOMINATOR_MESSAGE, num, den);<a name="line.268"></a>
272 <FONT color="green">269</FONT> }<a name="line.269"></a>
273 <FONT color="green">270</FONT> if (den &lt; 0) {<a name="line.270"></a>
274 <FONT color="green">271</FONT> if (num == Integer.MIN_VALUE || den == Integer.MIN_VALUE) {<a name="line.271"></a>
275 <FONT color="green">272</FONT> throw MathRuntimeException.createArithmeticException(<a name="line.272"></a>
276 <FONT color="green">273</FONT> OVERFLOW_MESSAGE, num, den);<a name="line.273"></a>
277 <FONT color="green">274</FONT> }<a name="line.274"></a>
278 <FONT color="green">275</FONT> num = -num;<a name="line.275"></a>
279 <FONT color="green">276</FONT> den = -den;<a name="line.276"></a>
280 <FONT color="green">277</FONT> }<a name="line.277"></a>
281 <FONT color="green">278</FONT> // reduce numerator and denominator by greatest common denominator.<a name="line.278"></a>
282 <FONT color="green">279</FONT> final int d = MathUtils.gcd(num, den);<a name="line.279"></a>
283 <FONT color="green">280</FONT> if (d &gt; 1) {<a name="line.280"></a>
284 <FONT color="green">281</FONT> num /= d;<a name="line.281"></a>
285 <FONT color="green">282</FONT> den /= d;<a name="line.282"></a>
286 <FONT color="green">283</FONT> }<a name="line.283"></a>
287 <FONT color="green">284</FONT> <a name="line.284"></a>
288 <FONT color="green">285</FONT> // move sign to numerator.<a name="line.285"></a>
289 <FONT color="green">286</FONT> if (den &lt; 0) {<a name="line.286"></a>
290 <FONT color="green">287</FONT> num = -num;<a name="line.287"></a>
291 <FONT color="green">288</FONT> den = -den;<a name="line.288"></a>
292 <FONT color="green">289</FONT> }<a name="line.289"></a>
293 <FONT color="green">290</FONT> this.numerator = num;<a name="line.290"></a>
294 <FONT color="green">291</FONT> this.denominator = den;<a name="line.291"></a>
295 <FONT color="green">292</FONT> }<a name="line.292"></a>
296 <FONT color="green">293</FONT> <a name="line.293"></a>
297 <FONT color="green">294</FONT> /**<a name="line.294"></a>
298 <FONT color="green">295</FONT> * Returns the absolute value of this fraction.<a name="line.295"></a>
299 <FONT color="green">296</FONT> * @return the absolute value.<a name="line.296"></a>
300 <FONT color="green">297</FONT> */<a name="line.297"></a>
301 <FONT color="green">298</FONT> public Fraction abs() {<a name="line.298"></a>
302 <FONT color="green">299</FONT> Fraction ret;<a name="line.299"></a>
303 <FONT color="green">300</FONT> if (numerator &gt;= 0) {<a name="line.300"></a>
304 <FONT color="green">301</FONT> ret = this;<a name="line.301"></a>
305 <FONT color="green">302</FONT> } else {<a name="line.302"></a>
306 <FONT color="green">303</FONT> ret = negate();<a name="line.303"></a>
307 <FONT color="green">304</FONT> }<a name="line.304"></a>
308 <FONT color="green">305</FONT> return ret;<a name="line.305"></a>
309 <FONT color="green">306</FONT> }<a name="line.306"></a>
310 <FONT color="green">307</FONT> <a name="line.307"></a>
311 <FONT color="green">308</FONT> /**<a name="line.308"></a>
312 <FONT color="green">309</FONT> * Compares this object to another based on size.<a name="line.309"></a>
313 <FONT color="green">310</FONT> * @param object the object to compare to<a name="line.310"></a>
314 <FONT color="green">311</FONT> * @return -1 if this is less than &lt;tt&gt;object&lt;/tt&gt;, +1 if this is greater<a name="line.311"></a>
315 <FONT color="green">312</FONT> * than &lt;tt&gt;object&lt;/tt&gt;, 0 if they are equal.<a name="line.312"></a>
316 <FONT color="green">313</FONT> */<a name="line.313"></a>
317 <FONT color="green">314</FONT> public int compareTo(Fraction object) {<a name="line.314"></a>
318 <FONT color="green">315</FONT> long nOd = ((long) numerator) * object.denominator;<a name="line.315"></a>
319 <FONT color="green">316</FONT> long dOn = ((long) denominator) * object.numerator;<a name="line.316"></a>
320 <FONT color="green">317</FONT> return (nOd &lt; dOn) ? -1 : ((nOd &gt; dOn) ? +1 : 0);<a name="line.317"></a>
321 <FONT color="green">318</FONT> }<a name="line.318"></a>
322 <FONT color="green">319</FONT> <a name="line.319"></a>
323 <FONT color="green">320</FONT> /**<a name="line.320"></a>
324 <FONT color="green">321</FONT> * Gets the fraction as a &lt;tt&gt;double&lt;/tt&gt;. This calculates the fraction as<a name="line.321"></a>
325 <FONT color="green">322</FONT> * the numerator divided by denominator.<a name="line.322"></a>
326 <FONT color="green">323</FONT> * @return the fraction as a &lt;tt&gt;double&lt;/tt&gt;<a name="line.323"></a>
327 <FONT color="green">324</FONT> */<a name="line.324"></a>
328 <FONT color="green">325</FONT> @Override<a name="line.325"></a>
329 <FONT color="green">326</FONT> public double doubleValue() {<a name="line.326"></a>
330 <FONT color="green">327</FONT> return (double)numerator / (double)denominator;<a name="line.327"></a>
331 <FONT color="green">328</FONT> }<a name="line.328"></a>
332 <FONT color="green">329</FONT> <a name="line.329"></a>
333 <FONT color="green">330</FONT> /**<a name="line.330"></a>
334 <FONT color="green">331</FONT> * Test for the equality of two fractions. If the lowest term<a name="line.331"></a>
335 <FONT color="green">332</FONT> * numerator and denominators are the same for both fractions, the two<a name="line.332"></a>
336 <FONT color="green">333</FONT> * fractions are considered to be equal.<a name="line.333"></a>
337 <FONT color="green">334</FONT> * @param other fraction to test for equality to this fraction<a name="line.334"></a>
338 <FONT color="green">335</FONT> * @return true if two fractions are equal, false if object is<a name="line.335"></a>
339 <FONT color="green">336</FONT> * &lt;tt&gt;null&lt;/tt&gt;, not an instance of {@link Fraction}, or not equal<a name="line.336"></a>
340 <FONT color="green">337</FONT> * to this fraction instance.<a name="line.337"></a>
341 <FONT color="green">338</FONT> */<a name="line.338"></a>
342 <FONT color="green">339</FONT> @Override<a name="line.339"></a>
343 <FONT color="green">340</FONT> public boolean equals(Object other) {<a name="line.340"></a>
344 <FONT color="green">341</FONT> if (this == other) {<a name="line.341"></a>
345 <FONT color="green">342</FONT> return true;<a name="line.342"></a>
346 <FONT color="green">343</FONT> }<a name="line.343"></a>
347 <FONT color="green">344</FONT> if (other instanceof Fraction) {<a name="line.344"></a>
348 <FONT color="green">345</FONT> // since fractions are always in lowest terms, numerators and<a name="line.345"></a>
349 <FONT color="green">346</FONT> // denominators can be compared directly for equality.<a name="line.346"></a>
350 <FONT color="green">347</FONT> Fraction rhs = (Fraction)other;<a name="line.347"></a>
351 <FONT color="green">348</FONT> return (numerator == rhs.numerator) &amp;&amp;<a name="line.348"></a>
352 <FONT color="green">349</FONT> (denominator == rhs.denominator);<a name="line.349"></a>
353 <FONT color="green">350</FONT> }<a name="line.350"></a>
354 <FONT color="green">351</FONT> return false;<a name="line.351"></a>
355 <FONT color="green">352</FONT> }<a name="line.352"></a>
356 <FONT color="green">353</FONT> <a name="line.353"></a>
357 <FONT color="green">354</FONT> /**<a name="line.354"></a>
358 <FONT color="green">355</FONT> * Gets the fraction as a &lt;tt&gt;float&lt;/tt&gt;. This calculates the fraction as<a name="line.355"></a>
359 <FONT color="green">356</FONT> * the numerator divided by denominator.<a name="line.356"></a>
360 <FONT color="green">357</FONT> * @return the fraction as a &lt;tt&gt;float&lt;/tt&gt;<a name="line.357"></a>
361 <FONT color="green">358</FONT> */<a name="line.358"></a>
362 <FONT color="green">359</FONT> @Override<a name="line.359"></a>
363 <FONT color="green">360</FONT> public float floatValue() {<a name="line.360"></a>
364 <FONT color="green">361</FONT> return (float)doubleValue();<a name="line.361"></a>
365 <FONT color="green">362</FONT> }<a name="line.362"></a>
366 <FONT color="green">363</FONT> <a name="line.363"></a>
367 <FONT color="green">364</FONT> /**<a name="line.364"></a>
368 <FONT color="green">365</FONT> * Access the denominator.<a name="line.365"></a>
369 <FONT color="green">366</FONT> * @return the denominator.<a name="line.366"></a>
370 <FONT color="green">367</FONT> */<a name="line.367"></a>
371 <FONT color="green">368</FONT> public int getDenominator() {<a name="line.368"></a>
372 <FONT color="green">369</FONT> return denominator;<a name="line.369"></a>
373 <FONT color="green">370</FONT> }<a name="line.370"></a>
374 <FONT color="green">371</FONT> <a name="line.371"></a>
375 <FONT color="green">372</FONT> /**<a name="line.372"></a>
376 <FONT color="green">373</FONT> * Access the numerator.<a name="line.373"></a>
377 <FONT color="green">374</FONT> * @return the numerator.<a name="line.374"></a>
378 <FONT color="green">375</FONT> */<a name="line.375"></a>
379 <FONT color="green">376</FONT> public int getNumerator() {<a name="line.376"></a>
380 <FONT color="green">377</FONT> return numerator;<a name="line.377"></a>
381 <FONT color="green">378</FONT> }<a name="line.378"></a>
382 <FONT color="green">379</FONT> <a name="line.379"></a>
383 <FONT color="green">380</FONT> /**<a name="line.380"></a>
384 <FONT color="green">381</FONT> * Gets a hashCode for the fraction.<a name="line.381"></a>
385 <FONT color="green">382</FONT> * @return a hash code value for this object<a name="line.382"></a>
386 <FONT color="green">383</FONT> */<a name="line.383"></a>
387 <FONT color="green">384</FONT> @Override<a name="line.384"></a>
388 <FONT color="green">385</FONT> public int hashCode() {<a name="line.385"></a>
389 <FONT color="green">386</FONT> return 37 * (37 * 17 + numerator) + denominator;<a name="line.386"></a>
390 <FONT color="green">387</FONT> }<a name="line.387"></a>
391 <FONT color="green">388</FONT> <a name="line.388"></a>
392 <FONT color="green">389</FONT> /**<a name="line.389"></a>
393 <FONT color="green">390</FONT> * Gets the fraction as an &lt;tt&gt;int&lt;/tt&gt;. This returns the whole number part<a name="line.390"></a>
394 <FONT color="green">391</FONT> * of the fraction.<a name="line.391"></a>
395 <FONT color="green">392</FONT> * @return the whole number fraction part<a name="line.392"></a>
396 <FONT color="green">393</FONT> */<a name="line.393"></a>
397 <FONT color="green">394</FONT> @Override<a name="line.394"></a>
398 <FONT color="green">395</FONT> public int intValue() {<a name="line.395"></a>
399 <FONT color="green">396</FONT> return (int)doubleValue();<a name="line.396"></a>
400 <FONT color="green">397</FONT> }<a name="line.397"></a>
401 <FONT color="green">398</FONT> <a name="line.398"></a>
402 <FONT color="green">399</FONT> /**<a name="line.399"></a>
403 <FONT color="green">400</FONT> * Gets the fraction as a &lt;tt&gt;long&lt;/tt&gt;. This returns the whole number part<a name="line.400"></a>
404 <FONT color="green">401</FONT> * of the fraction.<a name="line.401"></a>
405 <FONT color="green">402</FONT> * @return the whole number fraction part<a name="line.402"></a>
406 <FONT color="green">403</FONT> */<a name="line.403"></a>
407 <FONT color="green">404</FONT> @Override<a name="line.404"></a>
408 <FONT color="green">405</FONT> public long longValue() {<a name="line.405"></a>
409 <FONT color="green">406</FONT> return (long)doubleValue();<a name="line.406"></a>
410 <FONT color="green">407</FONT> }<a name="line.407"></a>
411 <FONT color="green">408</FONT> <a name="line.408"></a>
412 <FONT color="green">409</FONT> /**<a name="line.409"></a>
413 <FONT color="green">410</FONT> * Return the additive inverse of this fraction.<a name="line.410"></a>
414 <FONT color="green">411</FONT> * @return the negation of this fraction.<a name="line.411"></a>
415 <FONT color="green">412</FONT> */<a name="line.412"></a>
416 <FONT color="green">413</FONT> public Fraction negate() {<a name="line.413"></a>
417 <FONT color="green">414</FONT> if (numerator==Integer.MIN_VALUE) {<a name="line.414"></a>
418 <FONT color="green">415</FONT> throw MathRuntimeException.createArithmeticException(<a name="line.415"></a>
419 <FONT color="green">416</FONT> OVERFLOW_MESSAGE, numerator, denominator);<a name="line.416"></a>
420 <FONT color="green">417</FONT> }<a name="line.417"></a>
421 <FONT color="green">418</FONT> return new Fraction(-numerator, denominator);<a name="line.418"></a>
422 <FONT color="green">419</FONT> }<a name="line.419"></a>
423 <FONT color="green">420</FONT> <a name="line.420"></a>
424 <FONT color="green">421</FONT> /**<a name="line.421"></a>
425 <FONT color="green">422</FONT> * Return the multiplicative inverse of this fraction.<a name="line.422"></a>
426 <FONT color="green">423</FONT> * @return the reciprocal fraction<a name="line.423"></a>
427 <FONT color="green">424</FONT> */<a name="line.424"></a>
428 <FONT color="green">425</FONT> public Fraction reciprocal() {<a name="line.425"></a>
429 <FONT color="green">426</FONT> return new Fraction(denominator, numerator);<a name="line.426"></a>
430 <FONT color="green">427</FONT> }<a name="line.427"></a>
431 <FONT color="green">428</FONT> <a name="line.428"></a>
432 <FONT color="green">429</FONT> /**<a name="line.429"></a>
433 <FONT color="green">430</FONT> * &lt;p&gt;Adds the value of this fraction to another, returning the result in reduced form.<a name="line.430"></a>
434 <FONT color="green">431</FONT> * The algorithm follows Knuth, 4.5.1.&lt;/p&gt;<a name="line.431"></a>
435 <FONT color="green">432</FONT> *<a name="line.432"></a>
436 <FONT color="green">433</FONT> * @param fraction the fraction to add, must not be &lt;code&gt;null&lt;/code&gt;<a name="line.433"></a>
437 <FONT color="green">434</FONT> * @return a &lt;code&gt;Fraction&lt;/code&gt; instance with the resulting values<a name="line.434"></a>
438 <FONT color="green">435</FONT> * @throws IllegalArgumentException if the fraction is &lt;code&gt;null&lt;/code&gt;<a name="line.435"></a>
439 <FONT color="green">436</FONT> * @throws ArithmeticException if the resulting numerator or denominator exceeds<a name="line.436"></a>
440 <FONT color="green">437</FONT> * &lt;code&gt;Integer.MAX_VALUE&lt;/code&gt;<a name="line.437"></a>
441 <FONT color="green">438</FONT> */<a name="line.438"></a>
442 <FONT color="green">439</FONT> public Fraction add(Fraction fraction) {<a name="line.439"></a>
443 <FONT color="green">440</FONT> return addSub(fraction, true /* add */);<a name="line.440"></a>
444 <FONT color="green">441</FONT> }<a name="line.441"></a>
445 <FONT color="green">442</FONT> <a name="line.442"></a>
446 <FONT color="green">443</FONT> /**<a name="line.443"></a>
447 <FONT color="green">444</FONT> * Add an integer to the fraction.<a name="line.444"></a>
448 <FONT color="green">445</FONT> * @param i the &lt;tt&gt;integer&lt;/tt&gt; to add.<a name="line.445"></a>
449 <FONT color="green">446</FONT> * @return this + i<a name="line.446"></a>
450 <FONT color="green">447</FONT> */<a name="line.447"></a>
451 <FONT color="green">448</FONT> public Fraction add(final int i) {<a name="line.448"></a>
452 <FONT color="green">449</FONT> return new Fraction(numerator + i * denominator, denominator);<a name="line.449"></a>
453 <FONT color="green">450</FONT> }<a name="line.450"></a>
454 <FONT color="green">451</FONT> <a name="line.451"></a>
455 <FONT color="green">452</FONT> /**<a name="line.452"></a>
456 <FONT color="green">453</FONT> * &lt;p&gt;Subtracts the value of another fraction from the value of this one,<a name="line.453"></a>
457 <FONT color="green">454</FONT> * returning the result in reduced form.&lt;/p&gt;<a name="line.454"></a>
458 <FONT color="green">455</FONT> *<a name="line.455"></a>
459 <FONT color="green">456</FONT> * @param fraction the fraction to subtract, must not be &lt;code&gt;null&lt;/code&gt;<a name="line.456"></a>
460 <FONT color="green">457</FONT> * @return a &lt;code&gt;Fraction&lt;/code&gt; instance with the resulting values<a name="line.457"></a>
461 <FONT color="green">458</FONT> * @throws IllegalArgumentException if the fraction is &lt;code&gt;null&lt;/code&gt;<a name="line.458"></a>
462 <FONT color="green">459</FONT> * @throws ArithmeticException if the resulting numerator or denominator<a name="line.459"></a>
463 <FONT color="green">460</FONT> * cannot be represented in an &lt;code&gt;int&lt;/code&gt;.<a name="line.460"></a>
464 <FONT color="green">461</FONT> */<a name="line.461"></a>
465 <FONT color="green">462</FONT> public Fraction subtract(Fraction fraction) {<a name="line.462"></a>
466 <FONT color="green">463</FONT> return addSub(fraction, false /* subtract */);<a name="line.463"></a>
467 <FONT color="green">464</FONT> }<a name="line.464"></a>
468 <FONT color="green">465</FONT> <a name="line.465"></a>
469 <FONT color="green">466</FONT> /**<a name="line.466"></a>
470 <FONT color="green">467</FONT> * Subtract an integer from the fraction.<a name="line.467"></a>
471 <FONT color="green">468</FONT> * @param i the &lt;tt&gt;integer&lt;/tt&gt; to subtract.<a name="line.468"></a>
472 <FONT color="green">469</FONT> * @return this - i<a name="line.469"></a>
473 <FONT color="green">470</FONT> */<a name="line.470"></a>
474 <FONT color="green">471</FONT> public Fraction subtract(final int i) {<a name="line.471"></a>
475 <FONT color="green">472</FONT> return new Fraction(numerator - i * denominator, denominator);<a name="line.472"></a>
476 <FONT color="green">473</FONT> }<a name="line.473"></a>
477 <FONT color="green">474</FONT> <a name="line.474"></a>
478 <FONT color="green">475</FONT> /**<a name="line.475"></a>
479 <FONT color="green">476</FONT> * Implement add and subtract using algorithm described in Knuth 4.5.1.<a name="line.476"></a>
480 <FONT color="green">477</FONT> *<a name="line.477"></a>
481 <FONT color="green">478</FONT> * @param fraction the fraction to subtract, must not be &lt;code&gt;null&lt;/code&gt;<a name="line.478"></a>
482 <FONT color="green">479</FONT> * @param isAdd true to add, false to subtract<a name="line.479"></a>
483 <FONT color="green">480</FONT> * @return a &lt;code&gt;Fraction&lt;/code&gt; instance with the resulting values<a name="line.480"></a>
484 <FONT color="green">481</FONT> * @throws IllegalArgumentException if the fraction is &lt;code&gt;null&lt;/code&gt;<a name="line.481"></a>
485 <FONT color="green">482</FONT> * @throws ArithmeticException if the resulting numerator or denominator<a name="line.482"></a>
486 <FONT color="green">483</FONT> * cannot be represented in an &lt;code&gt;int&lt;/code&gt;.<a name="line.483"></a>
487 <FONT color="green">484</FONT> */<a name="line.484"></a>
488 <FONT color="green">485</FONT> private Fraction addSub(Fraction fraction, boolean isAdd) {<a name="line.485"></a>
489 <FONT color="green">486</FONT> if (fraction == null) {<a name="line.486"></a>
490 <FONT color="green">487</FONT> throw MathRuntimeException.createIllegalArgumentException(NULL_FRACTION);<a name="line.487"></a>
491 <FONT color="green">488</FONT> }<a name="line.488"></a>
492 <FONT color="green">489</FONT> // zero is identity for addition.<a name="line.489"></a>
493 <FONT color="green">490</FONT> if (numerator == 0) {<a name="line.490"></a>
494 <FONT color="green">491</FONT> return isAdd ? fraction : fraction.negate();<a name="line.491"></a>
495 <FONT color="green">492</FONT> }<a name="line.492"></a>
496 <FONT color="green">493</FONT> if (fraction.numerator == 0) {<a name="line.493"></a>
497 <FONT color="green">494</FONT> return this;<a name="line.494"></a>
498 <FONT color="green">495</FONT> }<a name="line.495"></a>
499 <FONT color="green">496</FONT> // if denominators are randomly distributed, d1 will be 1 about 61%<a name="line.496"></a>
500 <FONT color="green">497</FONT> // of the time.<a name="line.497"></a>
501 <FONT color="green">498</FONT> int d1 = MathUtils.gcd(denominator, fraction.denominator);<a name="line.498"></a>
502 <FONT color="green">499</FONT> if (d1==1) {<a name="line.499"></a>
503 <FONT color="green">500</FONT> // result is ( (u*v' +/- u'v) / u'v')<a name="line.500"></a>
504 <FONT color="green">501</FONT> int uvp = MathUtils.mulAndCheck(numerator, fraction.denominator);<a name="line.501"></a>
505 <FONT color="green">502</FONT> int upv = MathUtils.mulAndCheck(fraction.numerator, denominator);<a name="line.502"></a>
506 <FONT color="green">503</FONT> return new Fraction<a name="line.503"></a>
507 <FONT color="green">504</FONT> (isAdd ? MathUtils.addAndCheck(uvp, upv) :<a name="line.504"></a>
508 <FONT color="green">505</FONT> MathUtils.subAndCheck(uvp, upv),<a name="line.505"></a>
509 <FONT color="green">506</FONT> MathUtils.mulAndCheck(denominator, fraction.denominator));<a name="line.506"></a>
510 <FONT color="green">507</FONT> }<a name="line.507"></a>
511 <FONT color="green">508</FONT> // the quantity 't' requires 65 bits of precision; see knuth 4.5.1<a name="line.508"></a>
512 <FONT color="green">509</FONT> // exercise 7. we're going to use a BigInteger.<a name="line.509"></a>
513 <FONT color="green">510</FONT> // t = u(v'/d1) +/- v(u'/d1)<a name="line.510"></a>
514 <FONT color="green">511</FONT> BigInteger uvp = BigInteger.valueOf(numerator)<a name="line.511"></a>
515 <FONT color="green">512</FONT> .multiply(BigInteger.valueOf(fraction.denominator/d1));<a name="line.512"></a>
516 <FONT color="green">513</FONT> BigInteger upv = BigInteger.valueOf(fraction.numerator)<a name="line.513"></a>
517 <FONT color="green">514</FONT> .multiply(BigInteger.valueOf(denominator/d1));<a name="line.514"></a>
518 <FONT color="green">515</FONT> BigInteger t = isAdd ? uvp.add(upv) : uvp.subtract(upv);<a name="line.515"></a>
519 <FONT color="green">516</FONT> // but d2 doesn't need extra precision because<a name="line.516"></a>
520 <FONT color="green">517</FONT> // d2 = gcd(t,d1) = gcd(t mod d1, d1)<a name="line.517"></a>
521 <FONT color="green">518</FONT> int tmodd1 = t.mod(BigInteger.valueOf(d1)).intValue();<a name="line.518"></a>
522 <FONT color="green">519</FONT> int d2 = (tmodd1==0)?d1:MathUtils.gcd(tmodd1, d1);<a name="line.519"></a>
523 <FONT color="green">520</FONT> <a name="line.520"></a>
524 <FONT color="green">521</FONT> // result is (t/d2) / (u'/d1)(v'/d2)<a name="line.521"></a>
525 <FONT color="green">522</FONT> BigInteger w = t.divide(BigInteger.valueOf(d2));<a name="line.522"></a>
526 <FONT color="green">523</FONT> if (w.bitLength() &gt; 31) {<a name="line.523"></a>
527 <FONT color="green">524</FONT> throw MathRuntimeException.createArithmeticException("overflow, numerator too large after multiply: {0}",<a name="line.524"></a>
528 <FONT color="green">525</FONT> w);<a name="line.525"></a>
529 <FONT color="green">526</FONT> }<a name="line.526"></a>
530 <FONT color="green">527</FONT> return new Fraction (w.intValue(),<a name="line.527"></a>
531 <FONT color="green">528</FONT> MathUtils.mulAndCheck(denominator/d1,<a name="line.528"></a>
532 <FONT color="green">529</FONT> fraction.denominator/d2));<a name="line.529"></a>
533 <FONT color="green">530</FONT> }<a name="line.530"></a>
534 <FONT color="green">531</FONT> <a name="line.531"></a>
535 <FONT color="green">532</FONT> /**<a name="line.532"></a>
536 <FONT color="green">533</FONT> * &lt;p&gt;Multiplies the value of this fraction by another, returning the<a name="line.533"></a>
537 <FONT color="green">534</FONT> * result in reduced form.&lt;/p&gt;<a name="line.534"></a>
538 <FONT color="green">535</FONT> *<a name="line.535"></a>
539 <FONT color="green">536</FONT> * @param fraction the fraction to multiply by, must not be &lt;code&gt;null&lt;/code&gt;<a name="line.536"></a>
540 <FONT color="green">537</FONT> * @return a &lt;code&gt;Fraction&lt;/code&gt; instance with the resulting values<a name="line.537"></a>
541 <FONT color="green">538</FONT> * @throws IllegalArgumentException if the fraction is &lt;code&gt;null&lt;/code&gt;<a name="line.538"></a>
542 <FONT color="green">539</FONT> * @throws ArithmeticException if the resulting numerator or denominator exceeds<a name="line.539"></a>
543 <FONT color="green">540</FONT> * &lt;code&gt;Integer.MAX_VALUE&lt;/code&gt;<a name="line.540"></a>
544 <FONT color="green">541</FONT> */<a name="line.541"></a>
545 <FONT color="green">542</FONT> public Fraction multiply(Fraction fraction) {<a name="line.542"></a>
546 <FONT color="green">543</FONT> if (fraction == null) {<a name="line.543"></a>
547 <FONT color="green">544</FONT> throw MathRuntimeException.createIllegalArgumentException(NULL_FRACTION);<a name="line.544"></a>
548 <FONT color="green">545</FONT> }<a name="line.545"></a>
549 <FONT color="green">546</FONT> if (numerator == 0 || fraction.numerator == 0) {<a name="line.546"></a>
550 <FONT color="green">547</FONT> return ZERO;<a name="line.547"></a>
551 <FONT color="green">548</FONT> }<a name="line.548"></a>
552 <FONT color="green">549</FONT> // knuth 4.5.1<a name="line.549"></a>
553 <FONT color="green">550</FONT> // make sure we don't overflow unless the result *must* overflow.<a name="line.550"></a>
554 <FONT color="green">551</FONT> int d1 = MathUtils.gcd(numerator, fraction.denominator);<a name="line.551"></a>
555 <FONT color="green">552</FONT> int d2 = MathUtils.gcd(fraction.numerator, denominator);<a name="line.552"></a>
556 <FONT color="green">553</FONT> return getReducedFraction<a name="line.553"></a>
557 <FONT color="green">554</FONT> (MathUtils.mulAndCheck(numerator/d1, fraction.numerator/d2),<a name="line.554"></a>
558 <FONT color="green">555</FONT> MathUtils.mulAndCheck(denominator/d2, fraction.denominator/d1));<a name="line.555"></a>
559 <FONT color="green">556</FONT> }<a name="line.556"></a>
560 <FONT color="green">557</FONT> <a name="line.557"></a>
561 <FONT color="green">558</FONT> /**<a name="line.558"></a>
562 <FONT color="green">559</FONT> * Multiply the fraction by an integer.<a name="line.559"></a>
563 <FONT color="green">560</FONT> * @param i the &lt;tt&gt;integer&lt;/tt&gt; to multiply by.<a name="line.560"></a>
564 <FONT color="green">561</FONT> * @return this * i<a name="line.561"></a>
565 <FONT color="green">562</FONT> */<a name="line.562"></a>
566 <FONT color="green">563</FONT> public Fraction multiply(final int i) {<a name="line.563"></a>
567 <FONT color="green">564</FONT> return new Fraction(numerator * i, denominator);<a name="line.564"></a>
568 <FONT color="green">565</FONT> }<a name="line.565"></a>
569 <FONT color="green">566</FONT> <a name="line.566"></a>
570 <FONT color="green">567</FONT> /**<a name="line.567"></a>
571 <FONT color="green">568</FONT> * &lt;p&gt;Divide the value of this fraction by another.&lt;/p&gt;<a name="line.568"></a>
572 <FONT color="green">569</FONT> *<a name="line.569"></a>
573 <FONT color="green">570</FONT> * @param fraction the fraction to divide by, must not be &lt;code&gt;null&lt;/code&gt;<a name="line.570"></a>
574 <FONT color="green">571</FONT> * @return a &lt;code&gt;Fraction&lt;/code&gt; instance with the resulting values<a name="line.571"></a>
575 <FONT color="green">572</FONT> * @throws IllegalArgumentException if the fraction is &lt;code&gt;null&lt;/code&gt;<a name="line.572"></a>
576 <FONT color="green">573</FONT> * @throws ArithmeticException if the fraction to divide by is zero<a name="line.573"></a>
577 <FONT color="green">574</FONT> * @throws ArithmeticException if the resulting numerator or denominator exceeds<a name="line.574"></a>
578 <FONT color="green">575</FONT> * &lt;code&gt;Integer.MAX_VALUE&lt;/code&gt;<a name="line.575"></a>
579 <FONT color="green">576</FONT> */<a name="line.576"></a>
580 <FONT color="green">577</FONT> public Fraction divide(Fraction fraction) {<a name="line.577"></a>
581 <FONT color="green">578</FONT> if (fraction == null) {<a name="line.578"></a>
582 <FONT color="green">579</FONT> throw MathRuntimeException.createIllegalArgumentException(NULL_FRACTION);<a name="line.579"></a>
583 <FONT color="green">580</FONT> }<a name="line.580"></a>
584 <FONT color="green">581</FONT> if (fraction.numerator == 0) {<a name="line.581"></a>
585 <FONT color="green">582</FONT> throw MathRuntimeException.createArithmeticException(<a name="line.582"></a>
586 <FONT color="green">583</FONT> "the fraction to divide by must not be zero: {0}/{1}",<a name="line.583"></a>
587 <FONT color="green">584</FONT> fraction.numerator, fraction.denominator);<a name="line.584"></a>
588 <FONT color="green">585</FONT> }<a name="line.585"></a>
589 <FONT color="green">586</FONT> return multiply(fraction.reciprocal());<a name="line.586"></a>
590 <FONT color="green">587</FONT> }<a name="line.587"></a>
591 <FONT color="green">588</FONT> <a name="line.588"></a>
592 <FONT color="green">589</FONT> /**<a name="line.589"></a>
593 <FONT color="green">590</FONT> * Divide the fraction by an integer.<a name="line.590"></a>
594 <FONT color="green">591</FONT> * @param i the &lt;tt&gt;integer&lt;/tt&gt; to divide by.<a name="line.591"></a>
595 <FONT color="green">592</FONT> * @return this * i<a name="line.592"></a>
596 <FONT color="green">593</FONT> */<a name="line.593"></a>
597 <FONT color="green">594</FONT> public Fraction divide(final int i) {<a name="line.594"></a>
598 <FONT color="green">595</FONT> return new Fraction(numerator, denominator * i);<a name="line.595"></a>
599 <FONT color="green">596</FONT> }<a name="line.596"></a>
600 <FONT color="green">597</FONT> <a name="line.597"></a>
601 <FONT color="green">598</FONT> /**<a name="line.598"></a>
602 <FONT color="green">599</FONT> * &lt;p&gt;Creates a &lt;code&gt;Fraction&lt;/code&gt; instance with the 2 parts<a name="line.599"></a>
603 <FONT color="green">600</FONT> * of a fraction Y/Z.&lt;/p&gt;<a name="line.600"></a>
604 <FONT color="green">601</FONT> *<a name="line.601"></a>
605 <FONT color="green">602</FONT> * &lt;p&gt;Any negative signs are resolved to be on the numerator.&lt;/p&gt;<a name="line.602"></a>
606 <FONT color="green">603</FONT> *<a name="line.603"></a>
607 <FONT color="green">604</FONT> * @param numerator the numerator, for example the three in 'three sevenths'<a name="line.604"></a>
608 <FONT color="green">605</FONT> * @param denominator the denominator, for example the seven in 'three sevenths'<a name="line.605"></a>
609 <FONT color="green">606</FONT> * @return a new fraction instance, with the numerator and denominator reduced<a name="line.606"></a>
610 <FONT color="green">607</FONT> * @throws ArithmeticException if the denominator is &lt;code&gt;zero&lt;/code&gt;<a name="line.607"></a>
611 <FONT color="green">608</FONT> */<a name="line.608"></a>
612 <FONT color="green">609</FONT> public static Fraction getReducedFraction(int numerator, int denominator) {<a name="line.609"></a>
613 <FONT color="green">610</FONT> if (denominator == 0) {<a name="line.610"></a>
614 <FONT color="green">611</FONT> throw MathRuntimeException.createArithmeticException(<a name="line.611"></a>
615 <FONT color="green">612</FONT> ZERO_DENOMINATOR_MESSAGE, numerator, denominator);<a name="line.612"></a>
616 <FONT color="green">613</FONT> }<a name="line.613"></a>
617 <FONT color="green">614</FONT> if (numerator==0) {<a name="line.614"></a>
618 <FONT color="green">615</FONT> return ZERO; // normalize zero.<a name="line.615"></a>
619 <FONT color="green">616</FONT> }<a name="line.616"></a>
620 <FONT color="green">617</FONT> // allow 2^k/-2^31 as a valid fraction (where k&gt;0)<a name="line.617"></a>
621 <FONT color="green">618</FONT> if (denominator==Integer.MIN_VALUE &amp;&amp; (numerator&amp;1)==0) {<a name="line.618"></a>
622 <FONT color="green">619</FONT> numerator/=2; denominator/=2;<a name="line.619"></a>
623 <FONT color="green">620</FONT> }<a name="line.620"></a>
624 <FONT color="green">621</FONT> if (denominator &lt; 0) {<a name="line.621"></a>
625 <FONT color="green">622</FONT> if (numerator==Integer.MIN_VALUE ||<a name="line.622"></a>
626 <FONT color="green">623</FONT> denominator==Integer.MIN_VALUE) {<a name="line.623"></a>
627 <FONT color="green">624</FONT> throw MathRuntimeException.createArithmeticException(<a name="line.624"></a>
628 <FONT color="green">625</FONT> OVERFLOW_MESSAGE, numerator, denominator);<a name="line.625"></a>
629 <FONT color="green">626</FONT> }<a name="line.626"></a>
630 <FONT color="green">627</FONT> numerator = -numerator;<a name="line.627"></a>
631 <FONT color="green">628</FONT> denominator = -denominator;<a name="line.628"></a>
632 <FONT color="green">629</FONT> }<a name="line.629"></a>
633 <FONT color="green">630</FONT> // simplify fraction.<a name="line.630"></a>
634 <FONT color="green">631</FONT> int gcd = MathUtils.gcd(numerator, denominator);<a name="line.631"></a>
635 <FONT color="green">632</FONT> numerator /= gcd;<a name="line.632"></a>
636 <FONT color="green">633</FONT> denominator /= gcd;<a name="line.633"></a>
637 <FONT color="green">634</FONT> return new Fraction(numerator, denominator);<a name="line.634"></a>
638 <FONT color="green">635</FONT> }<a name="line.635"></a>
639 <FONT color="green">636</FONT> <a name="line.636"></a>
640 <FONT color="green">637</FONT> /**<a name="line.637"></a>
641 <FONT color="green">638</FONT> * &lt;p&gt;<a name="line.638"></a>
642 <FONT color="green">639</FONT> * Returns the &lt;code&gt;String&lt;/code&gt; representing this fraction, ie<a name="line.639"></a>
643 <FONT color="green">640</FONT> * "num / dem" or just "num" if the denominator is one.<a name="line.640"></a>
644 <FONT color="green">641</FONT> * &lt;/p&gt;<a name="line.641"></a>
645 <FONT color="green">642</FONT> *<a name="line.642"></a>
646 <FONT color="green">643</FONT> * @return a string representation of the fraction.<a name="line.643"></a>
647 <FONT color="green">644</FONT> * @see java.lang.Object#toString()<a name="line.644"></a>
648 <FONT color="green">645</FONT> */<a name="line.645"></a>
649 <FONT color="green">646</FONT> @Override<a name="line.646"></a>
650 <FONT color="green">647</FONT> public String toString() {<a name="line.647"></a>
651 <FONT color="green">648</FONT> String str = null;<a name="line.648"></a>
652 <FONT color="green">649</FONT> if (denominator == 1) {<a name="line.649"></a>
653 <FONT color="green">650</FONT> str = Integer.toString(numerator);<a name="line.650"></a>
654 <FONT color="green">651</FONT> } else if (numerator == 0) {<a name="line.651"></a>
655 <FONT color="green">652</FONT> str = "0";<a name="line.652"></a>
656 <FONT color="green">653</FONT> } else {<a name="line.653"></a>
657 <FONT color="green">654</FONT> str = numerator + " / " + denominator;<a name="line.654"></a>
658 <FONT color="green">655</FONT> }<a name="line.655"></a>
659 <FONT color="green">656</FONT> return str;<a name="line.656"></a>
660 <FONT color="green">657</FONT> }<a name="line.657"></a>
661 <FONT color="green">658</FONT> <a name="line.658"></a>
662 <FONT color="green">659</FONT> /** {@inheritDoc} */<a name="line.659"></a>
663 <FONT color="green">660</FONT> public FractionField getField() {<a name="line.660"></a>
664 <FONT color="green">661</FONT> return FractionField.getInstance();<a name="line.661"></a>
665 <FONT color="green">662</FONT> }<a name="line.662"></a>
666 <FONT color="green">663</FONT> <a name="line.663"></a>
667 <FONT color="green">664</FONT> }<a name="line.664"></a>
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728 </PRE>
729 </BODY>
730 </HTML>