comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/fraction/BigFraction.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.BigDecimal;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import java.math.BigInteger;<a name="line.21"></a>
25 <FONT color="green">022</FONT> <a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.FieldElement;<a name="line.23"></a>
27 <FONT color="green">024</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.24"></a>
28 <FONT color="green">025</FONT> import org.apache.commons.math.util.MathUtils;<a name="line.25"></a>
29 <FONT color="green">026</FONT> <a name="line.26"></a>
30 <FONT color="green">027</FONT> /**<a name="line.27"></a>
31 <FONT color="green">028</FONT> * Representation of a rational number without any overflow. This class is<a name="line.28"></a>
32 <FONT color="green">029</FONT> * immutable.<a name="line.29"></a>
33 <FONT color="green">030</FONT> *<a name="line.30"></a>
34 <FONT color="green">031</FONT> * @version $Revision: 906251 $ $Date: 2010-02-03 16:19:54 -0500 (Wed, 03 Feb 2010) $<a name="line.31"></a>
35 <FONT color="green">032</FONT> * @since 2.0<a name="line.32"></a>
36 <FONT color="green">033</FONT> */<a name="line.33"></a>
37 <FONT color="green">034</FONT> public class BigFraction<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;BigFraction&gt;, Comparable&lt;BigFraction&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 BigFraction TWO = new BigFraction(2);<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 BigFraction ONE = new BigFraction(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 BigFraction ZERO = new BigFraction(0);<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 "-1 / 1". */<a name="line.47"></a>
51 <FONT color="green">048</FONT> public static final BigFraction MINUS_ONE = new BigFraction(-1);<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 "4/5". */<a name="line.50"></a>
54 <FONT color="green">051</FONT> public static final BigFraction FOUR_FIFTHS = new BigFraction(4, 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/5". */<a name="line.53"></a>
57 <FONT color="green">054</FONT> public static final BigFraction ONE_FIFTH = new BigFraction(1, 5);<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/2". */<a name="line.56"></a>
60 <FONT color="green">057</FONT> public static final BigFraction ONE_HALF = new BigFraction(1, 2);<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/4". */<a name="line.59"></a>
63 <FONT color="green">060</FONT> public static final BigFraction ONE_QUARTER = new BigFraction(1, 4);<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 "1/3". */<a name="line.62"></a>
66 <FONT color="green">063</FONT> public static final BigFraction ONE_THIRD = new BigFraction(1, 3);<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/5". */<a name="line.65"></a>
69 <FONT color="green">066</FONT> public static final BigFraction THREE_FIFTHS = new BigFraction(3, 5);<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 "3/4". */<a name="line.68"></a>
72 <FONT color="green">069</FONT> public static final BigFraction THREE_QUARTERS = new BigFraction(3, 4);<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/5". */<a name="line.71"></a>
75 <FONT color="green">072</FONT> public static final BigFraction TWO_FIFTHS = new BigFraction(2, 5);<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/4". */<a name="line.74"></a>
78 <FONT color="green">075</FONT> public static final BigFraction TWO_QUARTERS = new BigFraction(2, 4);<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 "2/3". */<a name="line.77"></a>
81 <FONT color="green">078</FONT> public static final BigFraction TWO_THIRDS = new BigFraction(2, 3);<a name="line.78"></a>
82 <FONT color="green">079</FONT> <a name="line.79"></a>
83 <FONT color="green">080</FONT> /** Serializable version identifier. */<a name="line.80"></a>
84 <FONT color="green">081</FONT> private static final long serialVersionUID = -5630213147331578515L;<a name="line.81"></a>
85 <FONT color="green">082</FONT> <a name="line.82"></a>
86 <FONT color="green">083</FONT> /** Message for zero denominator. */<a name="line.83"></a>
87 <FONT color="green">084</FONT> private static final String FORBIDDEN_ZERO_DENOMINATOR =<a name="line.84"></a>
88 <FONT color="green">085</FONT> "denominator must be different from 0";<a name="line.85"></a>
89 <FONT color="green">086</FONT> <a name="line.86"></a>
90 <FONT color="green">087</FONT> /** &lt;code&gt;BigInteger&lt;/code&gt; representation of 100. */<a name="line.87"></a>
91 <FONT color="green">088</FONT> private static final BigInteger ONE_HUNDRED_DOUBLE = BigInteger.valueOf(100);<a name="line.88"></a>
92 <FONT color="green">089</FONT> <a name="line.89"></a>
93 <FONT color="green">090</FONT> /** The numerator. */<a name="line.90"></a>
94 <FONT color="green">091</FONT> private final BigInteger numerator;<a name="line.91"></a>
95 <FONT color="green">092</FONT> <a name="line.92"></a>
96 <FONT color="green">093</FONT> /** The denominator. */<a name="line.93"></a>
97 <FONT color="green">094</FONT> private final BigInteger denominator;<a name="line.94"></a>
98 <FONT color="green">095</FONT> <a name="line.95"></a>
99 <FONT color="green">096</FONT> /**<a name="line.96"></a>
100 <FONT color="green">097</FONT> * &lt;p&gt;<a name="line.97"></a>
101 <FONT color="green">098</FONT> * Create a {@link BigFraction} equivalent to the passed &lt;tt&gt;BigInteger&lt;/tt&gt;, ie<a name="line.98"></a>
102 <FONT color="green">099</FONT> * "num / 1".<a name="line.99"></a>
103 <FONT color="green">100</FONT> * &lt;/p&gt;<a name="line.100"></a>
104 <FONT color="green">101</FONT> *<a name="line.101"></a>
105 <FONT color="green">102</FONT> * @param num<a name="line.102"></a>
106 <FONT color="green">103</FONT> * the numerator.<a name="line.103"></a>
107 <FONT color="green">104</FONT> */<a name="line.104"></a>
108 <FONT color="green">105</FONT> public BigFraction(final BigInteger num) {<a name="line.105"></a>
109 <FONT color="green">106</FONT> this(num, BigInteger.ONE);<a name="line.106"></a>
110 <FONT color="green">107</FONT> }<a name="line.107"></a>
111 <FONT color="green">108</FONT> <a name="line.108"></a>
112 <FONT color="green">109</FONT> /**<a name="line.109"></a>
113 <FONT color="green">110</FONT> * &lt;p&gt;<a name="line.110"></a>
114 <FONT color="green">111</FONT> * Create a {@link BigFraction} given the numerator and denominator as<a name="line.111"></a>
115 <FONT color="green">112</FONT> * &lt;code&gt;BigInteger&lt;/code&gt;. The {@link BigFraction} is reduced to lowest terms.<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> *<a name="line.114"></a>
118 <FONT color="green">115</FONT> * @param num<a name="line.115"></a>
119 <FONT color="green">116</FONT> * the numerator, must not be &lt;code&gt;null&lt;/code&gt;.<a name="line.116"></a>
120 <FONT color="green">117</FONT> * @param den<a name="line.117"></a>
121 <FONT color="green">118</FONT> * the denominator, must not be &lt;code&gt;null&lt;/code&gt;.<a name="line.118"></a>
122 <FONT color="green">119</FONT> * @throws ArithmeticException<a name="line.119"></a>
123 <FONT color="green">120</FONT> * if the denominator is &lt;code&gt;zero&lt;/code&gt;.<a name="line.120"></a>
124 <FONT color="green">121</FONT> * @throws NullPointerException<a name="line.121"></a>
125 <FONT color="green">122</FONT> * if the numerator or the denominator is &lt;code&gt;zero&lt;/code&gt;.<a name="line.122"></a>
126 <FONT color="green">123</FONT> */<a name="line.123"></a>
127 <FONT color="green">124</FONT> public BigFraction(BigInteger num, BigInteger den) {<a name="line.124"></a>
128 <FONT color="green">125</FONT> if (num == null) {<a name="line.125"></a>
129 <FONT color="green">126</FONT> throw MathRuntimeException.createNullPointerException("numerator is null");<a name="line.126"></a>
130 <FONT color="green">127</FONT> }<a name="line.127"></a>
131 <FONT color="green">128</FONT> if (den == null) {<a name="line.128"></a>
132 <FONT color="green">129</FONT> throw MathRuntimeException.createNullPointerException("denominator is null");<a name="line.129"></a>
133 <FONT color="green">130</FONT> }<a name="line.130"></a>
134 <FONT color="green">131</FONT> if (BigInteger.ZERO.equals(den)) {<a name="line.131"></a>
135 <FONT color="green">132</FONT> throw MathRuntimeException.createArithmeticException(FORBIDDEN_ZERO_DENOMINATOR);<a name="line.132"></a>
136 <FONT color="green">133</FONT> }<a name="line.133"></a>
137 <FONT color="green">134</FONT> if (BigInteger.ZERO.equals(num)) {<a name="line.134"></a>
138 <FONT color="green">135</FONT> numerator = BigInteger.ZERO;<a name="line.135"></a>
139 <FONT color="green">136</FONT> denominator = BigInteger.ONE;<a name="line.136"></a>
140 <FONT color="green">137</FONT> } else {<a name="line.137"></a>
141 <FONT color="green">138</FONT> <a name="line.138"></a>
142 <FONT color="green">139</FONT> // reduce numerator and denominator by greatest common denominator<a name="line.139"></a>
143 <FONT color="green">140</FONT> final BigInteger gcd = num.gcd(den);<a name="line.140"></a>
144 <FONT color="green">141</FONT> if (BigInteger.ONE.compareTo(gcd) &lt; 0) {<a name="line.141"></a>
145 <FONT color="green">142</FONT> num = num.divide(gcd);<a name="line.142"></a>
146 <FONT color="green">143</FONT> den = den.divide(gcd);<a name="line.143"></a>
147 <FONT color="green">144</FONT> }<a name="line.144"></a>
148 <FONT color="green">145</FONT> <a name="line.145"></a>
149 <FONT color="green">146</FONT> // move sign to numerator<a name="line.146"></a>
150 <FONT color="green">147</FONT> if (BigInteger.ZERO.compareTo(den) &gt; 0) {<a name="line.147"></a>
151 <FONT color="green">148</FONT> num = num.negate();<a name="line.148"></a>
152 <FONT color="green">149</FONT> den = den.negate();<a name="line.149"></a>
153 <FONT color="green">150</FONT> }<a name="line.150"></a>
154 <FONT color="green">151</FONT> <a name="line.151"></a>
155 <FONT color="green">152</FONT> // store the values in the final fields<a name="line.152"></a>
156 <FONT color="green">153</FONT> numerator = num;<a name="line.153"></a>
157 <FONT color="green">154</FONT> denominator = den;<a name="line.154"></a>
158 <FONT color="green">155</FONT> <a name="line.155"></a>
159 <FONT color="green">156</FONT> }<a name="line.156"></a>
160 <FONT color="green">157</FONT> }<a name="line.157"></a>
161 <FONT color="green">158</FONT> <a name="line.158"></a>
162 <FONT color="green">159</FONT> /**<a name="line.159"></a>
163 <FONT color="green">160</FONT> * Create a fraction given the double value.<a name="line.160"></a>
164 <FONT color="green">161</FONT> * &lt;p&gt;<a name="line.161"></a>
165 <FONT color="green">162</FONT> * This constructor behaves &lt;em&gt;differently&lt;/em&gt; from<a name="line.162"></a>
166 <FONT color="green">163</FONT> * {@link #BigFraction(double, double, int)}. It converts the<a name="line.163"></a>
167 <FONT color="green">164</FONT> * double value exactly, considering its internal bits representation.<a name="line.164"></a>
168 <FONT color="green">165</FONT> * This does work for all values except NaN and infinities and does<a name="line.165"></a>
169 <FONT color="green">166</FONT> * not requires any loop or convergence threshold.<a name="line.166"></a>
170 <FONT color="green">167</FONT> * &lt;/p&gt;<a name="line.167"></a>
171 <FONT color="green">168</FONT> * &lt;p&gt;<a name="line.168"></a>
172 <FONT color="green">169</FONT> * Since this conversion is exact and since double numbers are sometimes<a name="line.169"></a>
173 <FONT color="green">170</FONT> * approximated, the fraction created may seem strange in some cases. For example<a name="line.170"></a>
174 <FONT color="green">171</FONT> * calling &lt;code&gt;new BigFraction(1.0 / 3.0)&lt;/code&gt; does &lt;em&gt;not&lt;/em&gt; create<a name="line.171"></a>
175 <FONT color="green">172</FONT> * the fraction 1/3 but the fraction 6004799503160661 / 18014398509481984<a name="line.172"></a>
176 <FONT color="green">173</FONT> * because the double number passed to the constructor is not exactly 1/3<a name="line.173"></a>
177 <FONT color="green">174</FONT> * (this number cannot be stored exactly in IEEE754).<a name="line.174"></a>
178 <FONT color="green">175</FONT> * &lt;/p&gt;<a name="line.175"></a>
179 <FONT color="green">176</FONT> * @see #BigFraction(double, double, int)<a name="line.176"></a>
180 <FONT color="green">177</FONT> * @param value the double value to convert to a fraction.<a name="line.177"></a>
181 <FONT color="green">178</FONT> * @exception IllegalArgumentException if value is NaN or infinite<a name="line.178"></a>
182 <FONT color="green">179</FONT> */<a name="line.179"></a>
183 <FONT color="green">180</FONT> public BigFraction(final double value) throws IllegalArgumentException {<a name="line.180"></a>
184 <FONT color="green">181</FONT> if (Double.isNaN(value)) {<a name="line.181"></a>
185 <FONT color="green">182</FONT> throw MathRuntimeException.createIllegalArgumentException("cannot convert NaN value");<a name="line.182"></a>
186 <FONT color="green">183</FONT> }<a name="line.183"></a>
187 <FONT color="green">184</FONT> if (Double.isInfinite(value)) {<a name="line.184"></a>
188 <FONT color="green">185</FONT> throw MathRuntimeException.createIllegalArgumentException("cannot convert infinite value");<a name="line.185"></a>
189 <FONT color="green">186</FONT> }<a name="line.186"></a>
190 <FONT color="green">187</FONT> <a name="line.187"></a>
191 <FONT color="green">188</FONT> // compute m and k such that value = m * 2^k<a name="line.188"></a>
192 <FONT color="green">189</FONT> final long bits = Double.doubleToLongBits(value);<a name="line.189"></a>
193 <FONT color="green">190</FONT> final long sign = bits &amp; 0x8000000000000000L;<a name="line.190"></a>
194 <FONT color="green">191</FONT> final long exponent = bits &amp; 0x7ff0000000000000L;<a name="line.191"></a>
195 <FONT color="green">192</FONT> long m = bits &amp; 0x000fffffffffffffL;<a name="line.192"></a>
196 <FONT color="green">193</FONT> if (exponent != 0) {<a name="line.193"></a>
197 <FONT color="green">194</FONT> // this was a normalized number, add the implicit most significant bit<a name="line.194"></a>
198 <FONT color="green">195</FONT> m |= 0x0010000000000000L;<a name="line.195"></a>
199 <FONT color="green">196</FONT> }<a name="line.196"></a>
200 <FONT color="green">197</FONT> if (sign != 0) {<a name="line.197"></a>
201 <FONT color="green">198</FONT> m = -m;<a name="line.198"></a>
202 <FONT color="green">199</FONT> }<a name="line.199"></a>
203 <FONT color="green">200</FONT> int k = ((int) (exponent &gt;&gt; 52)) - 1075;<a name="line.200"></a>
204 <FONT color="green">201</FONT> while (((m &amp; 0x001ffffffffffffeL) != 0) &amp;&amp; ((m &amp; 0x1) == 0)) {<a name="line.201"></a>
205 <FONT color="green">202</FONT> m = m &gt;&gt; 1;<a name="line.202"></a>
206 <FONT color="green">203</FONT> ++k;<a name="line.203"></a>
207 <FONT color="green">204</FONT> }<a name="line.204"></a>
208 <FONT color="green">205</FONT> <a name="line.205"></a>
209 <FONT color="green">206</FONT> if (k &lt; 0) {<a name="line.206"></a>
210 <FONT color="green">207</FONT> numerator = BigInteger.valueOf(m);<a name="line.207"></a>
211 <FONT color="green">208</FONT> denominator = BigInteger.ZERO.flipBit(-k);<a name="line.208"></a>
212 <FONT color="green">209</FONT> } else {<a name="line.209"></a>
213 <FONT color="green">210</FONT> numerator = BigInteger.valueOf(m).multiply(BigInteger.ZERO.flipBit(k));<a name="line.210"></a>
214 <FONT color="green">211</FONT> denominator = BigInteger.ONE;<a name="line.211"></a>
215 <FONT color="green">212</FONT> }<a name="line.212"></a>
216 <FONT color="green">213</FONT> <a name="line.213"></a>
217 <FONT color="green">214</FONT> }<a name="line.214"></a>
218 <FONT color="green">215</FONT> <a name="line.215"></a>
219 <FONT color="green">216</FONT> /**<a name="line.216"></a>
220 <FONT color="green">217</FONT> * Create a fraction given the double value and maximum error allowed.<a name="line.217"></a>
221 <FONT color="green">218</FONT> * &lt;p&gt;<a name="line.218"></a>
222 <FONT color="green">219</FONT> * References:<a name="line.219"></a>
223 <FONT color="green">220</FONT> * &lt;ul&gt;<a name="line.220"></a>
224 <FONT color="green">221</FONT> * &lt;li&gt;&lt;a href="http://mathworld.wolfram.com/ContinuedFraction.html"&gt;<a name="line.221"></a>
225 <FONT color="green">222</FONT> * Continued Fraction&lt;/a&gt; equations (11) and (22)-(26)&lt;/li&gt;<a name="line.222"></a>
226 <FONT color="green">223</FONT> * &lt;/ul&gt;<a name="line.223"></a>
227 <FONT color="green">224</FONT> * &lt;/p&gt;<a name="line.224"></a>
228 <FONT color="green">225</FONT> *<a name="line.225"></a>
229 <FONT color="green">226</FONT> * @param value<a name="line.226"></a>
230 <FONT color="green">227</FONT> * the double value to convert to a fraction.<a name="line.227"></a>
231 <FONT color="green">228</FONT> * @param epsilon<a name="line.228"></a>
232 <FONT color="green">229</FONT> * maximum error allowed. The resulting fraction is within<a name="line.229"></a>
233 <FONT color="green">230</FONT> * &lt;code&gt;epsilon&lt;/code&gt; of &lt;code&gt;value&lt;/code&gt;, in absolute terms.<a name="line.230"></a>
234 <FONT color="green">231</FONT> * @param maxIterations<a name="line.231"></a>
235 <FONT color="green">232</FONT> * maximum number of convergents.<a name="line.232"></a>
236 <FONT color="green">233</FONT> * @throws FractionConversionException<a name="line.233"></a>
237 <FONT color="green">234</FONT> * if the continued fraction failed to converge.<a name="line.234"></a>
238 <FONT color="green">235</FONT> * @see #BigFraction(double)<a name="line.235"></a>
239 <FONT color="green">236</FONT> */<a name="line.236"></a>
240 <FONT color="green">237</FONT> public BigFraction(final double value, final double epsilon,<a name="line.237"></a>
241 <FONT color="green">238</FONT> final int maxIterations)<a name="line.238"></a>
242 <FONT color="green">239</FONT> throws FractionConversionException {<a name="line.239"></a>
243 <FONT color="green">240</FONT> this(value, epsilon, Integer.MAX_VALUE, maxIterations);<a name="line.240"></a>
244 <FONT color="green">241</FONT> }<a name="line.241"></a>
245 <FONT color="green">242</FONT> <a name="line.242"></a>
246 <FONT color="green">243</FONT> /**<a name="line.243"></a>
247 <FONT color="green">244</FONT> * Create a fraction given the double value and either the maximum error<a name="line.244"></a>
248 <FONT color="green">245</FONT> * allowed or the maximum number of denominator digits.<a name="line.245"></a>
249 <FONT color="green">246</FONT> * &lt;p&gt;<a name="line.246"></a>
250 <FONT color="green">247</FONT> *<a name="line.247"></a>
251 <FONT color="green">248</FONT> * NOTE: This constructor is called with EITHER - a valid epsilon value and<a name="line.248"></a>
252 <FONT color="green">249</FONT> * the maxDenominator set to Integer.MAX_VALUE (that way the maxDenominator<a name="line.249"></a>
253 <FONT color="green">250</FONT> * has no effect). OR - a valid maxDenominator value and the epsilon value<a name="line.250"></a>
254 <FONT color="green">251</FONT> * set to zero (that way epsilon only has effect if there is an exact match<a name="line.251"></a>
255 <FONT color="green">252</FONT> * before the maxDenominator value is reached).<a name="line.252"></a>
256 <FONT color="green">253</FONT> * &lt;/p&gt;<a name="line.253"></a>
257 <FONT color="green">254</FONT> * &lt;p&gt;<a name="line.254"></a>
258 <FONT color="green">255</FONT> *<a name="line.255"></a>
259 <FONT color="green">256</FONT> * It has been done this way so that the same code can be (re)used for both<a name="line.256"></a>
260 <FONT color="green">257</FONT> * scenarios. However this could be confusing to users if it were part of<a name="line.257"></a>
261 <FONT color="green">258</FONT> * the public API and this constructor should therefore remain PRIVATE.<a name="line.258"></a>
262 <FONT color="green">259</FONT> * &lt;/p&gt;<a name="line.259"></a>
263 <FONT color="green">260</FONT> *<a name="line.260"></a>
264 <FONT color="green">261</FONT> * See JIRA issue ticket MATH-181 for more details:<a name="line.261"></a>
265 <FONT color="green">262</FONT> *<a name="line.262"></a>
266 <FONT color="green">263</FONT> * https://issues.apache.org/jira/browse/MATH-181<a name="line.263"></a>
267 <FONT color="green">264</FONT> *<a name="line.264"></a>
268 <FONT color="green">265</FONT> * @param value<a name="line.265"></a>
269 <FONT color="green">266</FONT> * the double value to convert to a fraction.<a name="line.266"></a>
270 <FONT color="green">267</FONT> * @param epsilon<a name="line.267"></a>
271 <FONT color="green">268</FONT> * maximum error allowed. The resulting fraction is within<a name="line.268"></a>
272 <FONT color="green">269</FONT> * &lt;code&gt;epsilon&lt;/code&gt; of &lt;code&gt;value&lt;/code&gt;, in absolute terms.<a name="line.269"></a>
273 <FONT color="green">270</FONT> * @param maxDenominator<a name="line.270"></a>
274 <FONT color="green">271</FONT> * maximum denominator value allowed.<a name="line.271"></a>
275 <FONT color="green">272</FONT> * @param maxIterations<a name="line.272"></a>
276 <FONT color="green">273</FONT> * maximum number of convergents.<a name="line.273"></a>
277 <FONT color="green">274</FONT> * @throws FractionConversionException<a name="line.274"></a>
278 <FONT color="green">275</FONT> * if the continued fraction failed to converge.<a name="line.275"></a>
279 <FONT color="green">276</FONT> */<a name="line.276"></a>
280 <FONT color="green">277</FONT> private BigFraction(final double value, final double epsilon,<a name="line.277"></a>
281 <FONT color="green">278</FONT> final int maxDenominator, int maxIterations)<a name="line.278"></a>
282 <FONT color="green">279</FONT> throws FractionConversionException {<a name="line.279"></a>
283 <FONT color="green">280</FONT> long overflow = Integer.MAX_VALUE;<a name="line.280"></a>
284 <FONT color="green">281</FONT> double r0 = value;<a name="line.281"></a>
285 <FONT color="green">282</FONT> long a0 = (long) Math.floor(r0);<a name="line.282"></a>
286 <FONT color="green">283</FONT> if (a0 &gt; overflow) {<a name="line.283"></a>
287 <FONT color="green">284</FONT> throw new FractionConversionException(value, a0, 1l);<a name="line.284"></a>
288 <FONT color="green">285</FONT> }<a name="line.285"></a>
289 <FONT color="green">286</FONT> <a name="line.286"></a>
290 <FONT color="green">287</FONT> // check for (almost) integer arguments, which should not go<a name="line.287"></a>
291 <FONT color="green">288</FONT> // to iterations.<a name="line.288"></a>
292 <FONT color="green">289</FONT> if (Math.abs(a0 - value) &lt; epsilon) {<a name="line.289"></a>
293 <FONT color="green">290</FONT> numerator = BigInteger.valueOf(a0);<a name="line.290"></a>
294 <FONT color="green">291</FONT> denominator = BigInteger.ONE;<a name="line.291"></a>
295 <FONT color="green">292</FONT> return;<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> long p0 = 1;<a name="line.295"></a>
299 <FONT color="green">296</FONT> long q0 = 0;<a name="line.296"></a>
300 <FONT color="green">297</FONT> long p1 = a0;<a name="line.297"></a>
301 <FONT color="green">298</FONT> long q1 = 1;<a name="line.298"></a>
302 <FONT color="green">299</FONT> <a name="line.299"></a>
303 <FONT color="green">300</FONT> long p2 = 0;<a name="line.300"></a>
304 <FONT color="green">301</FONT> long q2 = 1;<a name="line.301"></a>
305 <FONT color="green">302</FONT> <a name="line.302"></a>
306 <FONT color="green">303</FONT> int n = 0;<a name="line.303"></a>
307 <FONT color="green">304</FONT> boolean stop = false;<a name="line.304"></a>
308 <FONT color="green">305</FONT> do {<a name="line.305"></a>
309 <FONT color="green">306</FONT> ++n;<a name="line.306"></a>
310 <FONT color="green">307</FONT> final double r1 = 1.0 / (r0 - a0);<a name="line.307"></a>
311 <FONT color="green">308</FONT> final long a1 = (long) Math.floor(r1);<a name="line.308"></a>
312 <FONT color="green">309</FONT> p2 = (a1 * p1) + p0;<a name="line.309"></a>
313 <FONT color="green">310</FONT> q2 = (a1 * q1) + q0;<a name="line.310"></a>
314 <FONT color="green">311</FONT> if ((p2 &gt; overflow) || (q2 &gt; overflow)) {<a name="line.311"></a>
315 <FONT color="green">312</FONT> throw new FractionConversionException(value, p2, q2);<a name="line.312"></a>
316 <FONT color="green">313</FONT> }<a name="line.313"></a>
317 <FONT color="green">314</FONT> <a name="line.314"></a>
318 <FONT color="green">315</FONT> final double convergent = (double) p2 / (double) q2;<a name="line.315"></a>
319 <FONT color="green">316</FONT> if ((n &lt; maxIterations) &amp;&amp;<a name="line.316"></a>
320 <FONT color="green">317</FONT> (Math.abs(convergent - value) &gt; epsilon) &amp;&amp;<a name="line.317"></a>
321 <FONT color="green">318</FONT> (q2 &lt; maxDenominator)) {<a name="line.318"></a>
322 <FONT color="green">319</FONT> p0 = p1;<a name="line.319"></a>
323 <FONT color="green">320</FONT> p1 = p2;<a name="line.320"></a>
324 <FONT color="green">321</FONT> q0 = q1;<a name="line.321"></a>
325 <FONT color="green">322</FONT> q1 = q2;<a name="line.322"></a>
326 <FONT color="green">323</FONT> a0 = a1;<a name="line.323"></a>
327 <FONT color="green">324</FONT> r0 = r1;<a name="line.324"></a>
328 <FONT color="green">325</FONT> } else {<a name="line.325"></a>
329 <FONT color="green">326</FONT> stop = true;<a name="line.326"></a>
330 <FONT color="green">327</FONT> }<a name="line.327"></a>
331 <FONT color="green">328</FONT> } while (!stop);<a name="line.328"></a>
332 <FONT color="green">329</FONT> <a name="line.329"></a>
333 <FONT color="green">330</FONT> if (n &gt;= maxIterations) {<a name="line.330"></a>
334 <FONT color="green">331</FONT> throw new FractionConversionException(value, maxIterations);<a name="line.331"></a>
335 <FONT color="green">332</FONT> }<a name="line.332"></a>
336 <FONT color="green">333</FONT> <a name="line.333"></a>
337 <FONT color="green">334</FONT> if (q2 &lt; maxDenominator) {<a name="line.334"></a>
338 <FONT color="green">335</FONT> numerator = BigInteger.valueOf(p2);<a name="line.335"></a>
339 <FONT color="green">336</FONT> denominator = BigInteger.valueOf(q2);<a name="line.336"></a>
340 <FONT color="green">337</FONT> } else {<a name="line.337"></a>
341 <FONT color="green">338</FONT> numerator = BigInteger.valueOf(p1);<a name="line.338"></a>
342 <FONT color="green">339</FONT> denominator = BigInteger.valueOf(q1);<a name="line.339"></a>
343 <FONT color="green">340</FONT> }<a name="line.340"></a>
344 <FONT color="green">341</FONT> }<a name="line.341"></a>
345 <FONT color="green">342</FONT> <a name="line.342"></a>
346 <FONT color="green">343</FONT> /**<a name="line.343"></a>
347 <FONT color="green">344</FONT> * Create a fraction given the double value and maximum denominator.<a name="line.344"></a>
348 <FONT color="green">345</FONT> * &lt;p&gt;<a name="line.345"></a>
349 <FONT color="green">346</FONT> * References:<a name="line.346"></a>
350 <FONT color="green">347</FONT> * &lt;ul&gt;<a name="line.347"></a>
351 <FONT color="green">348</FONT> * &lt;li&gt;&lt;a href="http://mathworld.wolfram.com/ContinuedFraction.html"&gt;<a name="line.348"></a>
352 <FONT color="green">349</FONT> * Continued Fraction&lt;/a&gt; equations (11) and (22)-(26)&lt;/li&gt;<a name="line.349"></a>
353 <FONT color="green">350</FONT> * &lt;/ul&gt;<a name="line.350"></a>
354 <FONT color="green">351</FONT> * &lt;/p&gt;<a name="line.351"></a>
355 <FONT color="green">352</FONT> *<a name="line.352"></a>
356 <FONT color="green">353</FONT> * @param value<a name="line.353"></a>
357 <FONT color="green">354</FONT> * the double value to convert to a fraction.<a name="line.354"></a>
358 <FONT color="green">355</FONT> * @param maxDenominator<a name="line.355"></a>
359 <FONT color="green">356</FONT> * The maximum allowed value for denominator.<a name="line.356"></a>
360 <FONT color="green">357</FONT> * @throws FractionConversionException<a name="line.357"></a>
361 <FONT color="green">358</FONT> * if the continued fraction failed to converge.<a name="line.358"></a>
362 <FONT color="green">359</FONT> */<a name="line.359"></a>
363 <FONT color="green">360</FONT> public BigFraction(final double value, final int maxDenominator)<a name="line.360"></a>
364 <FONT color="green">361</FONT> throws FractionConversionException {<a name="line.361"></a>
365 <FONT color="green">362</FONT> this(value, 0, maxDenominator, 100);<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> /**<a name="line.365"></a>
369 <FONT color="green">366</FONT> * &lt;p&gt;<a name="line.366"></a>
370 <FONT color="green">367</FONT> * Create a {@link BigFraction} equivalent to the passed &lt;tt&gt;int&lt;/tt&gt;, ie<a name="line.367"></a>
371 <FONT color="green">368</FONT> * "num / 1".<a name="line.368"></a>
372 <FONT color="green">369</FONT> * &lt;/p&gt;<a name="line.369"></a>
373 <FONT color="green">370</FONT> *<a name="line.370"></a>
374 <FONT color="green">371</FONT> * @param num<a name="line.371"></a>
375 <FONT color="green">372</FONT> * the numerator.<a name="line.372"></a>
376 <FONT color="green">373</FONT> */<a name="line.373"></a>
377 <FONT color="green">374</FONT> public BigFraction(final int num) {<a name="line.374"></a>
378 <FONT color="green">375</FONT> this(BigInteger.valueOf(num), BigInteger.ONE);<a name="line.375"></a>
379 <FONT color="green">376</FONT> }<a name="line.376"></a>
380 <FONT color="green">377</FONT> <a name="line.377"></a>
381 <FONT color="green">378</FONT> /**<a name="line.378"></a>
382 <FONT color="green">379</FONT> * &lt;p&gt;<a name="line.379"></a>
383 <FONT color="green">380</FONT> * Create a {@link BigFraction} given the numerator and denominator as simple<a name="line.380"></a>
384 <FONT color="green">381</FONT> * &lt;tt&gt;int&lt;/tt&gt;. The {@link BigFraction} is reduced to lowest terms.<a name="line.381"></a>
385 <FONT color="green">382</FONT> * &lt;/p&gt;<a name="line.382"></a>
386 <FONT color="green">383</FONT> *<a name="line.383"></a>
387 <FONT color="green">384</FONT> * @param num<a name="line.384"></a>
388 <FONT color="green">385</FONT> * the numerator.<a name="line.385"></a>
389 <FONT color="green">386</FONT> * @param den<a name="line.386"></a>
390 <FONT color="green">387</FONT> * the denominator.<a name="line.387"></a>
391 <FONT color="green">388</FONT> */<a name="line.388"></a>
392 <FONT color="green">389</FONT> public BigFraction(final int num, final int den) {<a name="line.389"></a>
393 <FONT color="green">390</FONT> this(BigInteger.valueOf(num), BigInteger.valueOf(den));<a name="line.390"></a>
394 <FONT color="green">391</FONT> }<a name="line.391"></a>
395 <FONT color="green">392</FONT> <a name="line.392"></a>
396 <FONT color="green">393</FONT> /**<a name="line.393"></a>
397 <FONT color="green">394</FONT> * &lt;p&gt;<a name="line.394"></a>
398 <FONT color="green">395</FONT> * Create a {@link BigFraction} equivalent to the passed long, ie "num / 1".<a name="line.395"></a>
399 <FONT color="green">396</FONT> * &lt;/p&gt;<a name="line.396"></a>
400 <FONT color="green">397</FONT> *<a name="line.397"></a>
401 <FONT color="green">398</FONT> * @param num<a name="line.398"></a>
402 <FONT color="green">399</FONT> * the numerator.<a name="line.399"></a>
403 <FONT color="green">400</FONT> */<a name="line.400"></a>
404 <FONT color="green">401</FONT> public BigFraction(final long num) {<a name="line.401"></a>
405 <FONT color="green">402</FONT> this(BigInteger.valueOf(num), BigInteger.ONE);<a name="line.402"></a>
406 <FONT color="green">403</FONT> }<a name="line.403"></a>
407 <FONT color="green">404</FONT> <a name="line.404"></a>
408 <FONT color="green">405</FONT> /**<a name="line.405"></a>
409 <FONT color="green">406</FONT> * &lt;p&gt;<a name="line.406"></a>
410 <FONT color="green">407</FONT> * Create a {@link BigFraction} given the numerator and denominator as simple<a name="line.407"></a>
411 <FONT color="green">408</FONT> * &lt;tt&gt;long&lt;/tt&gt;. The {@link BigFraction} is reduced to lowest terms.<a name="line.408"></a>
412 <FONT color="green">409</FONT> * &lt;/p&gt;<a name="line.409"></a>
413 <FONT color="green">410</FONT> *<a name="line.410"></a>
414 <FONT color="green">411</FONT> * @param num<a name="line.411"></a>
415 <FONT color="green">412</FONT> * the numerator.<a name="line.412"></a>
416 <FONT color="green">413</FONT> * @param den<a name="line.413"></a>
417 <FONT color="green">414</FONT> * the denominator.<a name="line.414"></a>
418 <FONT color="green">415</FONT> */<a name="line.415"></a>
419 <FONT color="green">416</FONT> public BigFraction(final long num, final long den) {<a name="line.416"></a>
420 <FONT color="green">417</FONT> this(BigInteger.valueOf(num), BigInteger.valueOf(den));<a name="line.417"></a>
421 <FONT color="green">418</FONT> }<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> * &lt;p&gt;<a name="line.421"></a>
425 <FONT color="green">422</FONT> * Creates a &lt;code&gt;BigFraction&lt;/code&gt; instance with the 2 parts of a fraction<a name="line.422"></a>
426 <FONT color="green">423</FONT> * Y/Z.<a name="line.423"></a>
427 <FONT color="green">424</FONT> * &lt;/p&gt;<a name="line.424"></a>
428 <FONT color="green">425</FONT> *<a name="line.425"></a>
429 <FONT color="green">426</FONT> * &lt;p&gt;<a name="line.426"></a>
430 <FONT color="green">427</FONT> * Any negative signs are resolved to be on the numerator.<a name="line.427"></a>
431 <FONT color="green">428</FONT> * &lt;/p&gt;<a name="line.428"></a>
432 <FONT color="green">429</FONT> *<a name="line.429"></a>
433 <FONT color="green">430</FONT> * @param numerator<a name="line.430"></a>
434 <FONT color="green">431</FONT> * the numerator, for example the three in 'three sevenths'.<a name="line.431"></a>
435 <FONT color="green">432</FONT> * @param denominator<a name="line.432"></a>
436 <FONT color="green">433</FONT> * the denominator, for example the seven in 'three sevenths'.<a name="line.433"></a>
437 <FONT color="green">434</FONT> * @return a new fraction instance, with the numerator and denominator<a name="line.434"></a>
438 <FONT color="green">435</FONT> * reduced.<a name="line.435"></a>
439 <FONT color="green">436</FONT> * @throws ArithmeticException<a name="line.436"></a>
440 <FONT color="green">437</FONT> * if the denominator is &lt;code&gt;zero&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 static BigFraction getReducedFraction(final int numerator,<a name="line.439"></a>
443 <FONT color="green">440</FONT> final int denominator) {<a name="line.440"></a>
444 <FONT color="green">441</FONT> if (numerator == 0) {<a name="line.441"></a>
445 <FONT color="green">442</FONT> return ZERO; // normalize zero.<a name="line.442"></a>
446 <FONT color="green">443</FONT> }<a name="line.443"></a>
447 <FONT color="green">444</FONT> <a name="line.444"></a>
448 <FONT color="green">445</FONT> return new BigFraction(numerator, denominator);<a name="line.445"></a>
449 <FONT color="green">446</FONT> }<a name="line.446"></a>
450 <FONT color="green">447</FONT> <a name="line.447"></a>
451 <FONT color="green">448</FONT> /**<a name="line.448"></a>
452 <FONT color="green">449</FONT> * &lt;p&gt;<a name="line.449"></a>
453 <FONT color="green">450</FONT> * Returns the absolute value of this {@link BigFraction}.<a name="line.450"></a>
454 <FONT color="green">451</FONT> * &lt;/p&gt;<a name="line.451"></a>
455 <FONT color="green">452</FONT> *<a name="line.452"></a>
456 <FONT color="green">453</FONT> * @return the absolute value as a {@link BigFraction}.<a name="line.453"></a>
457 <FONT color="green">454</FONT> */<a name="line.454"></a>
458 <FONT color="green">455</FONT> public BigFraction abs() {<a name="line.455"></a>
459 <FONT color="green">456</FONT> return (BigInteger.ZERO.compareTo(numerator) &lt;= 0) ? this : negate();<a name="line.456"></a>
460 <FONT color="green">457</FONT> }<a name="line.457"></a>
461 <FONT color="green">458</FONT> <a name="line.458"></a>
462 <FONT color="green">459</FONT> /**<a name="line.459"></a>
463 <FONT color="green">460</FONT> * &lt;p&gt;<a name="line.460"></a>
464 <FONT color="green">461</FONT> * Adds the value of this fraction to the passed {@link BigInteger},<a name="line.461"></a>
465 <FONT color="green">462</FONT> * returning the result in reduced form.<a name="line.462"></a>
466 <FONT color="green">463</FONT> * &lt;/p&gt;<a name="line.463"></a>
467 <FONT color="green">464</FONT> *<a name="line.464"></a>
468 <FONT color="green">465</FONT> * @param bg<a name="line.465"></a>
469 <FONT color="green">466</FONT> * the {@link BigInteger} to add, must'nt be &lt;code&gt;null&lt;/code&gt;.<a name="line.466"></a>
470 <FONT color="green">467</FONT> * @return a &lt;code&gt;BigFraction&lt;/code&gt; instance with the resulting values.<a name="line.467"></a>
471 <FONT color="green">468</FONT> * @throws NullPointerException<a name="line.468"></a>
472 <FONT color="green">469</FONT> * if the {@link BigInteger} is &lt;code&gt;null&lt;/code&gt;.<a name="line.469"></a>
473 <FONT color="green">470</FONT> */<a name="line.470"></a>
474 <FONT color="green">471</FONT> public BigFraction add(final BigInteger bg) {<a name="line.471"></a>
475 <FONT color="green">472</FONT> return new BigFraction(numerator.add(denominator.multiply(bg)), 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> * &lt;p&gt;<a name="line.476"></a>
480 <FONT color="green">477</FONT> * Adds the value of this fraction to the passed &lt;tt&gt;integer&lt;/tt&gt;, returning<a name="line.477"></a>
481 <FONT color="green">478</FONT> * the result in reduced form.<a name="line.478"></a>
482 <FONT color="green">479</FONT> * &lt;/p&gt;<a name="line.479"></a>
483 <FONT color="green">480</FONT> *<a name="line.480"></a>
484 <FONT color="green">481</FONT> * @param i<a name="line.481"></a>
485 <FONT color="green">482</FONT> * the &lt;tt&gt;integer&lt;/tt&gt; to add.<a name="line.482"></a>
486 <FONT color="green">483</FONT> * @return a &lt;code&gt;BigFraction&lt;/code&gt; instance with the resulting values.<a name="line.483"></a>
487 <FONT color="green">484</FONT> */<a name="line.484"></a>
488 <FONT color="green">485</FONT> public BigFraction add(final int i) {<a name="line.485"></a>
489 <FONT color="green">486</FONT> return add(BigInteger.valueOf(i));<a name="line.486"></a>
490 <FONT color="green">487</FONT> }<a name="line.487"></a>
491 <FONT color="green">488</FONT> <a name="line.488"></a>
492 <FONT color="green">489</FONT> /**<a name="line.489"></a>
493 <FONT color="green">490</FONT> * &lt;p&gt;<a name="line.490"></a>
494 <FONT color="green">491</FONT> * Adds the value of this fraction to the passed &lt;tt&gt;long&lt;/tt&gt;, returning<a name="line.491"></a>
495 <FONT color="green">492</FONT> * the result in reduced form.<a name="line.492"></a>
496 <FONT color="green">493</FONT> * &lt;/p&gt;<a name="line.493"></a>
497 <FONT color="green">494</FONT> *<a name="line.494"></a>
498 <FONT color="green">495</FONT> * @param l<a name="line.495"></a>
499 <FONT color="green">496</FONT> * the &lt;tt&gt;long&lt;/tt&gt; to add.<a name="line.496"></a>
500 <FONT color="green">497</FONT> * @return a &lt;code&gt;BigFraction&lt;/code&gt; instance with the resulting values.<a name="line.497"></a>
501 <FONT color="green">498</FONT> */<a name="line.498"></a>
502 <FONT color="green">499</FONT> public BigFraction add(final long l) {<a name="line.499"></a>
503 <FONT color="green">500</FONT> return add(BigInteger.valueOf(l));<a name="line.500"></a>
504 <FONT color="green">501</FONT> }<a name="line.501"></a>
505 <FONT color="green">502</FONT> <a name="line.502"></a>
506 <FONT color="green">503</FONT> /**<a name="line.503"></a>
507 <FONT color="green">504</FONT> * &lt;p&gt;<a name="line.504"></a>
508 <FONT color="green">505</FONT> * Adds the value of this fraction to another, returning the result in<a name="line.505"></a>
509 <FONT color="green">506</FONT> * reduced form.<a name="line.506"></a>
510 <FONT color="green">507</FONT> * &lt;/p&gt;<a name="line.507"></a>
511 <FONT color="green">508</FONT> *<a name="line.508"></a>
512 <FONT color="green">509</FONT> * @param fraction<a name="line.509"></a>
513 <FONT color="green">510</FONT> * the {@link BigFraction} to add, must not be &lt;code&gt;null&lt;/code&gt;.<a name="line.510"></a>
514 <FONT color="green">511</FONT> * @return a {@link BigFraction} instance with the resulting values.<a name="line.511"></a>
515 <FONT color="green">512</FONT> * @throws NullPointerException<a name="line.512"></a>
516 <FONT color="green">513</FONT> * if the {@link BigFraction} is &lt;code&gt;null&lt;/code&gt;.<a name="line.513"></a>
517 <FONT color="green">514</FONT> */<a name="line.514"></a>
518 <FONT color="green">515</FONT> public BigFraction add(final BigFraction fraction) {<a name="line.515"></a>
519 <FONT color="green">516</FONT> if (ZERO.equals(fraction)) {<a name="line.516"></a>
520 <FONT color="green">517</FONT> return this;<a name="line.517"></a>
521 <FONT color="green">518</FONT> }<a name="line.518"></a>
522 <FONT color="green">519</FONT> <a name="line.519"></a>
523 <FONT color="green">520</FONT> BigInteger num = null;<a name="line.520"></a>
524 <FONT color="green">521</FONT> BigInteger den = null;<a name="line.521"></a>
525 <FONT color="green">522</FONT> <a name="line.522"></a>
526 <FONT color="green">523</FONT> if (denominator.equals(fraction.denominator)) {<a name="line.523"></a>
527 <FONT color="green">524</FONT> num = numerator.add(fraction.numerator);<a name="line.524"></a>
528 <FONT color="green">525</FONT> den = denominator;<a name="line.525"></a>
529 <FONT color="green">526</FONT> } else {<a name="line.526"></a>
530 <FONT color="green">527</FONT> num = (numerator.multiply(fraction.denominator)).add((fraction.numerator).multiply(denominator));<a name="line.527"></a>
531 <FONT color="green">528</FONT> den = denominator.multiply(fraction.denominator);<a name="line.528"></a>
532 <FONT color="green">529</FONT> }<a name="line.529"></a>
533 <FONT color="green">530</FONT> return new BigFraction(num, den);<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> <a name="line.533"></a>
537 <FONT color="green">534</FONT> /**<a name="line.534"></a>
538 <FONT color="green">535</FONT> * &lt;p&gt;<a name="line.535"></a>
539 <FONT color="green">536</FONT> * Gets the fraction as a &lt;code&gt;BigDecimal&lt;/code&gt;. This calculates the<a name="line.536"></a>
540 <FONT color="green">537</FONT> * fraction as the numerator divided by denominator.<a name="line.537"></a>
541 <FONT color="green">538</FONT> * &lt;/p&gt;<a name="line.538"></a>
542 <FONT color="green">539</FONT> *<a name="line.539"></a>
543 <FONT color="green">540</FONT> * @return the fraction as a &lt;code&gt;BigDecimal&lt;/code&gt;.<a name="line.540"></a>
544 <FONT color="green">541</FONT> * @throws ArithmeticException<a name="line.541"></a>
545 <FONT color="green">542</FONT> * if the exact quotient does not have a terminating decimal<a name="line.542"></a>
546 <FONT color="green">543</FONT> * expansion.<a name="line.543"></a>
547 <FONT color="green">544</FONT> * @see BigDecimal<a name="line.544"></a>
548 <FONT color="green">545</FONT> */<a name="line.545"></a>
549 <FONT color="green">546</FONT> public BigDecimal bigDecimalValue() {<a name="line.546"></a>
550 <FONT color="green">547</FONT> return new BigDecimal(numerator).divide(new BigDecimal(denominator));<a name="line.547"></a>
551 <FONT color="green">548</FONT> }<a name="line.548"></a>
552 <FONT color="green">549</FONT> <a name="line.549"></a>
553 <FONT color="green">550</FONT> /**<a name="line.550"></a>
554 <FONT color="green">551</FONT> * &lt;p&gt;<a name="line.551"></a>
555 <FONT color="green">552</FONT> * Gets the fraction as a &lt;code&gt;BigDecimal&lt;/code&gt; following the passed<a name="line.552"></a>
556 <FONT color="green">553</FONT> * rounding mode. This calculates the fraction as the numerator divided by<a name="line.553"></a>
557 <FONT color="green">554</FONT> * denominator.<a name="line.554"></a>
558 <FONT color="green">555</FONT> * &lt;/p&gt;<a name="line.555"></a>
559 <FONT color="green">556</FONT> *<a name="line.556"></a>
560 <FONT color="green">557</FONT> * @param roundingMode<a name="line.557"></a>
561 <FONT color="green">558</FONT> * rounding mode to apply. see {@link BigDecimal} constants.<a name="line.558"></a>
562 <FONT color="green">559</FONT> * @return the fraction as a &lt;code&gt;BigDecimal&lt;/code&gt;.<a name="line.559"></a>
563 <FONT color="green">560</FONT> * @throws IllegalArgumentException<a name="line.560"></a>
564 <FONT color="green">561</FONT> * if &lt;tt&gt;roundingMode&lt;/tt&gt; does not represent a valid rounding<a name="line.561"></a>
565 <FONT color="green">562</FONT> * mode.<a name="line.562"></a>
566 <FONT color="green">563</FONT> * @see BigDecimal<a name="line.563"></a>
567 <FONT color="green">564</FONT> */<a name="line.564"></a>
568 <FONT color="green">565</FONT> public BigDecimal bigDecimalValue(final int roundingMode) {<a name="line.565"></a>
569 <FONT color="green">566</FONT> return new BigDecimal(numerator).divide(new BigDecimal(denominator), roundingMode);<a name="line.566"></a>
570 <FONT color="green">567</FONT> }<a name="line.567"></a>
571 <FONT color="green">568</FONT> <a name="line.568"></a>
572 <FONT color="green">569</FONT> /**<a name="line.569"></a>
573 <FONT color="green">570</FONT> * &lt;p&gt;<a name="line.570"></a>
574 <FONT color="green">571</FONT> * Gets the fraction as a &lt;code&gt;BigDecimal&lt;/code&gt; following the passed scale<a name="line.571"></a>
575 <FONT color="green">572</FONT> * and rounding mode. This calculates the fraction as the numerator divided<a name="line.572"></a>
576 <FONT color="green">573</FONT> * by denominator.<a name="line.573"></a>
577 <FONT color="green">574</FONT> * &lt;/p&gt;<a name="line.574"></a>
578 <FONT color="green">575</FONT> *<a name="line.575"></a>
579 <FONT color="green">576</FONT> * @param scale<a name="line.576"></a>
580 <FONT color="green">577</FONT> * scale of the &lt;code&gt;BigDecimal&lt;/code&gt; quotient to be returned.<a name="line.577"></a>
581 <FONT color="green">578</FONT> * see {@link BigDecimal} for more information.<a name="line.578"></a>
582 <FONT color="green">579</FONT> * @param roundingMode<a name="line.579"></a>
583 <FONT color="green">580</FONT> * rounding mode to apply. see {@link BigDecimal} constants.<a name="line.580"></a>
584 <FONT color="green">581</FONT> * @return the fraction as a &lt;code&gt;BigDecimal&lt;/code&gt;.<a name="line.581"></a>
585 <FONT color="green">582</FONT> * @see BigDecimal<a name="line.582"></a>
586 <FONT color="green">583</FONT> */<a name="line.583"></a>
587 <FONT color="green">584</FONT> public BigDecimal bigDecimalValue(final int scale, final int roundingMode) {<a name="line.584"></a>
588 <FONT color="green">585</FONT> return new BigDecimal(numerator).divide(new BigDecimal(denominator), scale, roundingMode);<a name="line.585"></a>
589 <FONT color="green">586</FONT> }<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> * &lt;p&gt;<a name="line.589"></a>
593 <FONT color="green">590</FONT> * Compares this object to another based on size.<a name="line.590"></a>
594 <FONT color="green">591</FONT> * &lt;/p&gt;<a name="line.591"></a>
595 <FONT color="green">592</FONT> *<a name="line.592"></a>
596 <FONT color="green">593</FONT> * @param object<a name="line.593"></a>
597 <FONT color="green">594</FONT> * the object to compare to, must not be &lt;code&gt;null&lt;/code&gt;.<a name="line.594"></a>
598 <FONT color="green">595</FONT> * @return -1 if this is less than &lt;tt&gt;object&lt;/tt&gt;, +1 if this is greater<a name="line.595"></a>
599 <FONT color="green">596</FONT> * than &lt;tt&gt;object&lt;/tt&gt;, 0 if they are equal.<a name="line.596"></a>
600 <FONT color="green">597</FONT> * @see java.lang.Comparable#compareTo(java.lang.Object)<a name="line.597"></a>
601 <FONT color="green">598</FONT> */<a name="line.598"></a>
602 <FONT color="green">599</FONT> public int compareTo(final BigFraction object) {<a name="line.599"></a>
603 <FONT color="green">600</FONT> BigInteger nOd = numerator.multiply(object.denominator);<a name="line.600"></a>
604 <FONT color="green">601</FONT> BigInteger dOn = denominator.multiply(object.numerator);<a name="line.601"></a>
605 <FONT color="green">602</FONT> return nOd.compareTo(dOn);<a name="line.602"></a>
606 <FONT color="green">603</FONT> }<a name="line.603"></a>
607 <FONT color="green">604</FONT> <a name="line.604"></a>
608 <FONT color="green">605</FONT> /**<a name="line.605"></a>
609 <FONT color="green">606</FONT> * &lt;p&gt;<a name="line.606"></a>
610 <FONT color="green">607</FONT> * Divide the value of this fraction by the passed &lt;code&gt;BigInteger&lt;/code&gt;,<a name="line.607"></a>
611 <FONT color="green">608</FONT> * ie "this * 1 / bg", returning the result in reduced form.<a name="line.608"></a>
612 <FONT color="green">609</FONT> * &lt;/p&gt;<a name="line.609"></a>
613 <FONT color="green">610</FONT> *<a name="line.610"></a>
614 <FONT color="green">611</FONT> * @param bg<a name="line.611"></a>
615 <FONT color="green">612</FONT> * the &lt;code&gt;BigInteger&lt;/code&gt; to divide by, must not be<a name="line.612"></a>
616 <FONT color="green">613</FONT> * &lt;code&gt;null&lt;/code&gt;.<a name="line.613"></a>
617 <FONT color="green">614</FONT> * @return a {@link BigFraction} instance with the resulting values.<a name="line.614"></a>
618 <FONT color="green">615</FONT> * @throws NullPointerException<a name="line.615"></a>
619 <FONT color="green">616</FONT> * if the &lt;code&gt;BigInteger&lt;/code&gt; is &lt;code&gt;null&lt;/code&gt;.<a name="line.616"></a>
620 <FONT color="green">617</FONT> * @throws ArithmeticException<a name="line.617"></a>
621 <FONT color="green">618</FONT> * if the fraction to divide by is zero.<a name="line.618"></a>
622 <FONT color="green">619</FONT> */<a name="line.619"></a>
623 <FONT color="green">620</FONT> public BigFraction divide(final BigInteger bg) {<a name="line.620"></a>
624 <FONT color="green">621</FONT> if (BigInteger.ZERO.equals(bg)) {<a name="line.621"></a>
625 <FONT color="green">622</FONT> throw MathRuntimeException.createArithmeticException(FORBIDDEN_ZERO_DENOMINATOR);<a name="line.622"></a>
626 <FONT color="green">623</FONT> }<a name="line.623"></a>
627 <FONT color="green">624</FONT> return new BigFraction(numerator, denominator.multiply(bg));<a name="line.624"></a>
628 <FONT color="green">625</FONT> }<a name="line.625"></a>
629 <FONT color="green">626</FONT> <a name="line.626"></a>
630 <FONT color="green">627</FONT> /**<a name="line.627"></a>
631 <FONT color="green">628</FONT> * &lt;p&gt;<a name="line.628"></a>
632 <FONT color="green">629</FONT> * Divide the value of this fraction by the passed &lt;tt&gt;int&lt;/tt&gt;, ie<a name="line.629"></a>
633 <FONT color="green">630</FONT> * "this * 1 / i", returning the result in reduced form.<a name="line.630"></a>
634 <FONT color="green">631</FONT> * &lt;/p&gt;<a name="line.631"></a>
635 <FONT color="green">632</FONT> *<a name="line.632"></a>
636 <FONT color="green">633</FONT> * @param i<a name="line.633"></a>
637 <FONT color="green">634</FONT> * the &lt;tt&gt;int&lt;/tt&gt; to divide by.<a name="line.634"></a>
638 <FONT color="green">635</FONT> * @return a {@link BigFraction} instance with the resulting values.<a name="line.635"></a>
639 <FONT color="green">636</FONT> * @throws ArithmeticException<a name="line.636"></a>
640 <FONT color="green">637</FONT> * if the fraction to divide by is zero.<a name="line.637"></a>
641 <FONT color="green">638</FONT> */<a name="line.638"></a>
642 <FONT color="green">639</FONT> public BigFraction divide(final int i) {<a name="line.639"></a>
643 <FONT color="green">640</FONT> return divide(BigInteger.valueOf(i));<a name="line.640"></a>
644 <FONT color="green">641</FONT> }<a name="line.641"></a>
645 <FONT color="green">642</FONT> <a name="line.642"></a>
646 <FONT color="green">643</FONT> /**<a name="line.643"></a>
647 <FONT color="green">644</FONT> * &lt;p&gt;<a name="line.644"></a>
648 <FONT color="green">645</FONT> * Divide the value of this fraction by the passed &lt;tt&gt;long&lt;/tt&gt;, ie<a name="line.645"></a>
649 <FONT color="green">646</FONT> * "this * 1 / l", returning the result in reduced form.<a name="line.646"></a>
650 <FONT color="green">647</FONT> * &lt;/p&gt;<a name="line.647"></a>
651 <FONT color="green">648</FONT> *<a name="line.648"></a>
652 <FONT color="green">649</FONT> * @param l<a name="line.649"></a>
653 <FONT color="green">650</FONT> * the &lt;tt&gt;long&lt;/tt&gt; to divide by.<a name="line.650"></a>
654 <FONT color="green">651</FONT> * @return a {@link BigFraction} instance with the resulting values.<a name="line.651"></a>
655 <FONT color="green">652</FONT> * @throws ArithmeticException<a name="line.652"></a>
656 <FONT color="green">653</FONT> * if the fraction to divide by is zero.<a name="line.653"></a>
657 <FONT color="green">654</FONT> */<a name="line.654"></a>
658 <FONT color="green">655</FONT> public BigFraction divide(final long l) {<a name="line.655"></a>
659 <FONT color="green">656</FONT> return divide(BigInteger.valueOf(l));<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> /**<a name="line.659"></a>
663 <FONT color="green">660</FONT> * &lt;p&gt;<a name="line.660"></a>
664 <FONT color="green">661</FONT> * Divide the value of this fraction by another, returning the result in<a name="line.661"></a>
665 <FONT color="green">662</FONT> * reduced form.<a name="line.662"></a>
666 <FONT color="green">663</FONT> * &lt;/p&gt;<a name="line.663"></a>
667 <FONT color="green">664</FONT> *<a name="line.664"></a>
668 <FONT color="green">665</FONT> * @param fraction<a name="line.665"></a>
669 <FONT color="green">666</FONT> * the fraction to divide by, must not be &lt;code&gt;null&lt;/code&gt;.<a name="line.666"></a>
670 <FONT color="green">667</FONT> * @return a {@link BigFraction} instance with the resulting values.<a name="line.667"></a>
671 <FONT color="green">668</FONT> * @throws NullPointerException<a name="line.668"></a>
672 <FONT color="green">669</FONT> * if the fraction is &lt;code&gt;null&lt;/code&gt;.<a name="line.669"></a>
673 <FONT color="green">670</FONT> * @throws ArithmeticException<a name="line.670"></a>
674 <FONT color="green">671</FONT> * if the fraction to divide by is zero.<a name="line.671"></a>
675 <FONT color="green">672</FONT> */<a name="line.672"></a>
676 <FONT color="green">673</FONT> public BigFraction divide(final BigFraction fraction) {<a name="line.673"></a>
677 <FONT color="green">674</FONT> if (BigInteger.ZERO.equals(fraction.numerator)) {<a name="line.674"></a>
678 <FONT color="green">675</FONT> throw MathRuntimeException.createArithmeticException(FORBIDDEN_ZERO_DENOMINATOR);<a name="line.675"></a>
679 <FONT color="green">676</FONT> }<a name="line.676"></a>
680 <FONT color="green">677</FONT> <a name="line.677"></a>
681 <FONT color="green">678</FONT> return multiply(fraction.reciprocal());<a name="line.678"></a>
682 <FONT color="green">679</FONT> }<a name="line.679"></a>
683 <FONT color="green">680</FONT> <a name="line.680"></a>
684 <FONT color="green">681</FONT> /**<a name="line.681"></a>
685 <FONT color="green">682</FONT> * &lt;p&gt;<a name="line.682"></a>
686 <FONT color="green">683</FONT> * Gets the fraction as a &lt;tt&gt;double&lt;/tt&gt;. This calculates the fraction as<a name="line.683"></a>
687 <FONT color="green">684</FONT> * the numerator divided by denominator.<a name="line.684"></a>
688 <FONT color="green">685</FONT> * &lt;/p&gt;<a name="line.685"></a>
689 <FONT color="green">686</FONT> *<a name="line.686"></a>
690 <FONT color="green">687</FONT> * @return the fraction as a &lt;tt&gt;double&lt;/tt&gt;<a name="line.687"></a>
691 <FONT color="green">688</FONT> * @see java.lang.Number#doubleValue()<a name="line.688"></a>
692 <FONT color="green">689</FONT> */<a name="line.689"></a>
693 <FONT color="green">690</FONT> @Override<a name="line.690"></a>
694 <FONT color="green">691</FONT> public double doubleValue() {<a name="line.691"></a>
695 <FONT color="green">692</FONT> return numerator.doubleValue() / denominator.doubleValue();<a name="line.692"></a>
696 <FONT color="green">693</FONT> }<a name="line.693"></a>
697 <FONT color="green">694</FONT> <a name="line.694"></a>
698 <FONT color="green">695</FONT> /**<a name="line.695"></a>
699 <FONT color="green">696</FONT> * &lt;p&gt;<a name="line.696"></a>
700 <FONT color="green">697</FONT> * Test for the equality of two fractions. If the lowest term numerator and<a name="line.697"></a>
701 <FONT color="green">698</FONT> * denominators are the same for both fractions, the two fractions are<a name="line.698"></a>
702 <FONT color="green">699</FONT> * considered to be equal.<a name="line.699"></a>
703 <FONT color="green">700</FONT> * &lt;/p&gt;<a name="line.700"></a>
704 <FONT color="green">701</FONT> *<a name="line.701"></a>
705 <FONT color="green">702</FONT> * @param other<a name="line.702"></a>
706 <FONT color="green">703</FONT> * fraction to test for equality to this fraction, can be<a name="line.703"></a>
707 <FONT color="green">704</FONT> * &lt;code&gt;null&lt;/code&gt;.<a name="line.704"></a>
708 <FONT color="green">705</FONT> * @return true if two fractions are equal, false if object is<a name="line.705"></a>
709 <FONT color="green">706</FONT> * &lt;code&gt;null&lt;/code&gt;, not an instance of {@link BigFraction}, or not<a name="line.706"></a>
710 <FONT color="green">707</FONT> * equal to this fraction instance.<a name="line.707"></a>
711 <FONT color="green">708</FONT> * @see java.lang.Object#equals(java.lang.Object)<a name="line.708"></a>
712 <FONT color="green">709</FONT> */<a name="line.709"></a>
713 <FONT color="green">710</FONT> @Override<a name="line.710"></a>
714 <FONT color="green">711</FONT> public boolean equals(final Object other) {<a name="line.711"></a>
715 <FONT color="green">712</FONT> boolean ret = false;<a name="line.712"></a>
716 <FONT color="green">713</FONT> <a name="line.713"></a>
717 <FONT color="green">714</FONT> if (this == other) {<a name="line.714"></a>
718 <FONT color="green">715</FONT> ret = true;<a name="line.715"></a>
719 <FONT color="green">716</FONT> } else if (other instanceof BigFraction) {<a name="line.716"></a>
720 <FONT color="green">717</FONT> BigFraction rhs = ((BigFraction) other).reduce();<a name="line.717"></a>
721 <FONT color="green">718</FONT> BigFraction thisOne = this.reduce();<a name="line.718"></a>
722 <FONT color="green">719</FONT> ret = thisOne.numerator.equals(rhs.numerator) &amp;&amp; thisOne.denominator.equals(rhs.denominator);<a name="line.719"></a>
723 <FONT color="green">720</FONT> }<a name="line.720"></a>
724 <FONT color="green">721</FONT> <a name="line.721"></a>
725 <FONT color="green">722</FONT> return ret;<a name="line.722"></a>
726 <FONT color="green">723</FONT> }<a name="line.723"></a>
727 <FONT color="green">724</FONT> <a name="line.724"></a>
728 <FONT color="green">725</FONT> /**<a name="line.725"></a>
729 <FONT color="green">726</FONT> * &lt;p&gt;<a name="line.726"></a>
730 <FONT color="green">727</FONT> * Gets the fraction as a &lt;tt&gt;float&lt;/tt&gt;. This calculates the fraction as<a name="line.727"></a>
731 <FONT color="green">728</FONT> * the numerator divided by denominator.<a name="line.728"></a>
732 <FONT color="green">729</FONT> * &lt;/p&gt;<a name="line.729"></a>
733 <FONT color="green">730</FONT> *<a name="line.730"></a>
734 <FONT color="green">731</FONT> * @return the fraction as a &lt;tt&gt;float&lt;/tt&gt;.<a name="line.731"></a>
735 <FONT color="green">732</FONT> * @see java.lang.Number#floatValue()<a name="line.732"></a>
736 <FONT color="green">733</FONT> */<a name="line.733"></a>
737 <FONT color="green">734</FONT> @Override<a name="line.734"></a>
738 <FONT color="green">735</FONT> public float floatValue() {<a name="line.735"></a>
739 <FONT color="green">736</FONT> return numerator.floatValue() / denominator.floatValue();<a name="line.736"></a>
740 <FONT color="green">737</FONT> }<a name="line.737"></a>
741 <FONT color="green">738</FONT> <a name="line.738"></a>
742 <FONT color="green">739</FONT> /**<a name="line.739"></a>
743 <FONT color="green">740</FONT> * &lt;p&gt;<a name="line.740"></a>
744 <FONT color="green">741</FONT> * Access the denominator as a &lt;code&gt;BigInteger&lt;/code&gt;.<a name="line.741"></a>
745 <FONT color="green">742</FONT> * &lt;/p&gt;<a name="line.742"></a>
746 <FONT color="green">743</FONT> *<a name="line.743"></a>
747 <FONT color="green">744</FONT> * @return the denominator as a &lt;code&gt;BigInteger&lt;/code&gt;.<a name="line.744"></a>
748 <FONT color="green">745</FONT> */<a name="line.745"></a>
749 <FONT color="green">746</FONT> public BigInteger getDenominator() {<a name="line.746"></a>
750 <FONT color="green">747</FONT> return denominator;<a name="line.747"></a>
751 <FONT color="green">748</FONT> }<a name="line.748"></a>
752 <FONT color="green">749</FONT> <a name="line.749"></a>
753 <FONT color="green">750</FONT> /**<a name="line.750"></a>
754 <FONT color="green">751</FONT> * &lt;p&gt;<a name="line.751"></a>
755 <FONT color="green">752</FONT> * Access the denominator as a &lt;tt&gt;int&lt;/tt&gt;.<a name="line.752"></a>
756 <FONT color="green">753</FONT> * &lt;/p&gt;<a name="line.753"></a>
757 <FONT color="green">754</FONT> *<a name="line.754"></a>
758 <FONT color="green">755</FONT> * @return the denominator as a &lt;tt&gt;int&lt;/tt&gt;.<a name="line.755"></a>
759 <FONT color="green">756</FONT> */<a name="line.756"></a>
760 <FONT color="green">757</FONT> public int getDenominatorAsInt() {<a name="line.757"></a>
761 <FONT color="green">758</FONT> return denominator.intValue();<a name="line.758"></a>
762 <FONT color="green">759</FONT> }<a name="line.759"></a>
763 <FONT color="green">760</FONT> <a name="line.760"></a>
764 <FONT color="green">761</FONT> /**<a name="line.761"></a>
765 <FONT color="green">762</FONT> * &lt;p&gt;<a name="line.762"></a>
766 <FONT color="green">763</FONT> * Access the denominator as a &lt;tt&gt;long&lt;/tt&gt;.<a name="line.763"></a>
767 <FONT color="green">764</FONT> * &lt;/p&gt;<a name="line.764"></a>
768 <FONT color="green">765</FONT> *<a name="line.765"></a>
769 <FONT color="green">766</FONT> * @return the denominator as a &lt;tt&gt;long&lt;/tt&gt;.<a name="line.766"></a>
770 <FONT color="green">767</FONT> */<a name="line.767"></a>
771 <FONT color="green">768</FONT> public long getDenominatorAsLong() {<a name="line.768"></a>
772 <FONT color="green">769</FONT> return denominator.longValue();<a name="line.769"></a>
773 <FONT color="green">770</FONT> }<a name="line.770"></a>
774 <FONT color="green">771</FONT> <a name="line.771"></a>
775 <FONT color="green">772</FONT> /**<a name="line.772"></a>
776 <FONT color="green">773</FONT> * &lt;p&gt;<a name="line.773"></a>
777 <FONT color="green">774</FONT> * Access the numerator as a &lt;code&gt;BigInteger&lt;/code&gt;.<a name="line.774"></a>
778 <FONT color="green">775</FONT> * &lt;/p&gt;<a name="line.775"></a>
779 <FONT color="green">776</FONT> *<a name="line.776"></a>
780 <FONT color="green">777</FONT> * @return the numerator as a &lt;code&gt;BigInteger&lt;/code&gt;.<a name="line.777"></a>
781 <FONT color="green">778</FONT> */<a name="line.778"></a>
782 <FONT color="green">779</FONT> public BigInteger getNumerator() {<a name="line.779"></a>
783 <FONT color="green">780</FONT> return numerator;<a name="line.780"></a>
784 <FONT color="green">781</FONT> }<a name="line.781"></a>
785 <FONT color="green">782</FONT> <a name="line.782"></a>
786 <FONT color="green">783</FONT> /**<a name="line.783"></a>
787 <FONT color="green">784</FONT> * &lt;p&gt;<a name="line.784"></a>
788 <FONT color="green">785</FONT> * Access the numerator as a &lt;tt&gt;int&lt;/tt&gt;.<a name="line.785"></a>
789 <FONT color="green">786</FONT> * &lt;/p&gt;<a name="line.786"></a>
790 <FONT color="green">787</FONT> *<a name="line.787"></a>
791 <FONT color="green">788</FONT> * @return the numerator as a &lt;tt&gt;int&lt;/tt&gt;.<a name="line.788"></a>
792 <FONT color="green">789</FONT> */<a name="line.789"></a>
793 <FONT color="green">790</FONT> public int getNumeratorAsInt() {<a name="line.790"></a>
794 <FONT color="green">791</FONT> return numerator.intValue();<a name="line.791"></a>
795 <FONT color="green">792</FONT> }<a name="line.792"></a>
796 <FONT color="green">793</FONT> <a name="line.793"></a>
797 <FONT color="green">794</FONT> /**<a name="line.794"></a>
798 <FONT color="green">795</FONT> * &lt;p&gt;<a name="line.795"></a>
799 <FONT color="green">796</FONT> * Access the numerator as a &lt;tt&gt;long&lt;/tt&gt;.<a name="line.796"></a>
800 <FONT color="green">797</FONT> * &lt;/p&gt;<a name="line.797"></a>
801 <FONT color="green">798</FONT> *<a name="line.798"></a>
802 <FONT color="green">799</FONT> * @return the numerator as a &lt;tt&gt;long&lt;/tt&gt;.<a name="line.799"></a>
803 <FONT color="green">800</FONT> */<a name="line.800"></a>
804 <FONT color="green">801</FONT> public long getNumeratorAsLong() {<a name="line.801"></a>
805 <FONT color="green">802</FONT> return numerator.longValue();<a name="line.802"></a>
806 <FONT color="green">803</FONT> }<a name="line.803"></a>
807 <FONT color="green">804</FONT> <a name="line.804"></a>
808 <FONT color="green">805</FONT> /**<a name="line.805"></a>
809 <FONT color="green">806</FONT> * &lt;p&gt;<a name="line.806"></a>
810 <FONT color="green">807</FONT> * Gets a hashCode for the fraction.<a name="line.807"></a>
811 <FONT color="green">808</FONT> * &lt;/p&gt;<a name="line.808"></a>
812 <FONT color="green">809</FONT> *<a name="line.809"></a>
813 <FONT color="green">810</FONT> * @return a hash code value for this object.<a name="line.810"></a>
814 <FONT color="green">811</FONT> * @see java.lang.Object#hashCode()<a name="line.811"></a>
815 <FONT color="green">812</FONT> */<a name="line.812"></a>
816 <FONT color="green">813</FONT> @Override<a name="line.813"></a>
817 <FONT color="green">814</FONT> public int hashCode() {<a name="line.814"></a>
818 <FONT color="green">815</FONT> return 37 * (37 * 17 + numerator.hashCode()) + denominator.hashCode();<a name="line.815"></a>
819 <FONT color="green">816</FONT> }<a name="line.816"></a>
820 <FONT color="green">817</FONT> <a name="line.817"></a>
821 <FONT color="green">818</FONT> /**<a name="line.818"></a>
822 <FONT color="green">819</FONT> * &lt;p&gt;<a name="line.819"></a>
823 <FONT color="green">820</FONT> * Gets the fraction as an &lt;tt&gt;int&lt;/tt&gt;. This returns the whole number part<a name="line.820"></a>
824 <FONT color="green">821</FONT> * of the fraction.<a name="line.821"></a>
825 <FONT color="green">822</FONT> * &lt;/p&gt;<a name="line.822"></a>
826 <FONT color="green">823</FONT> *<a name="line.823"></a>
827 <FONT color="green">824</FONT> * @return the whole number fraction part.<a name="line.824"></a>
828 <FONT color="green">825</FONT> * @see java.lang.Number#intValue()<a name="line.825"></a>
829 <FONT color="green">826</FONT> */<a name="line.826"></a>
830 <FONT color="green">827</FONT> @Override<a name="line.827"></a>
831 <FONT color="green">828</FONT> public int intValue() {<a name="line.828"></a>
832 <FONT color="green">829</FONT> return numerator.divide(denominator).intValue();<a name="line.829"></a>
833 <FONT color="green">830</FONT> }<a name="line.830"></a>
834 <FONT color="green">831</FONT> <a name="line.831"></a>
835 <FONT color="green">832</FONT> /**<a name="line.832"></a>
836 <FONT color="green">833</FONT> * &lt;p&gt;<a name="line.833"></a>
837 <FONT color="green">834</FONT> * Gets the fraction as a &lt;tt&gt;long&lt;/tt&gt;. This returns the whole number part<a name="line.834"></a>
838 <FONT color="green">835</FONT> * of the fraction.<a name="line.835"></a>
839 <FONT color="green">836</FONT> * &lt;/p&gt;<a name="line.836"></a>
840 <FONT color="green">837</FONT> *<a name="line.837"></a>
841 <FONT color="green">838</FONT> * @return the whole number fraction part.<a name="line.838"></a>
842 <FONT color="green">839</FONT> * @see java.lang.Number#longValue()<a name="line.839"></a>
843 <FONT color="green">840</FONT> */<a name="line.840"></a>
844 <FONT color="green">841</FONT> @Override<a name="line.841"></a>
845 <FONT color="green">842</FONT> public long longValue() {<a name="line.842"></a>
846 <FONT color="green">843</FONT> return numerator.divide(denominator).longValue();<a name="line.843"></a>
847 <FONT color="green">844</FONT> }<a name="line.844"></a>
848 <FONT color="green">845</FONT> <a name="line.845"></a>
849 <FONT color="green">846</FONT> /**<a name="line.846"></a>
850 <FONT color="green">847</FONT> * &lt;p&gt;<a name="line.847"></a>
851 <FONT color="green">848</FONT> * Multiplies the value of this fraction by the passed<a name="line.848"></a>
852 <FONT color="green">849</FONT> * &lt;code&gt;BigInteger&lt;/code&gt;, returning the result in reduced form.<a name="line.849"></a>
853 <FONT color="green">850</FONT> * &lt;/p&gt;<a name="line.850"></a>
854 <FONT color="green">851</FONT> *<a name="line.851"></a>
855 <FONT color="green">852</FONT> * @param bg<a name="line.852"></a>
856 <FONT color="green">853</FONT> * the &lt;code&gt;BigInteger&lt;/code&gt; to multiply by.<a name="line.853"></a>
857 <FONT color="green">854</FONT> * @return a &lt;code&gt;BigFraction&lt;/code&gt; instance with the resulting values.<a name="line.854"></a>
858 <FONT color="green">855</FONT> * @throws NullPointerException<a name="line.855"></a>
859 <FONT color="green">856</FONT> * if the bg is &lt;code&gt;null&lt;/code&gt;.<a name="line.856"></a>
860 <FONT color="green">857</FONT> */<a name="line.857"></a>
861 <FONT color="green">858</FONT> public BigFraction multiply(final BigInteger bg) {<a name="line.858"></a>
862 <FONT color="green">859</FONT> return new BigFraction(bg.multiply(numerator), denominator);<a name="line.859"></a>
863 <FONT color="green">860</FONT> }<a name="line.860"></a>
864 <FONT color="green">861</FONT> <a name="line.861"></a>
865 <FONT color="green">862</FONT> /**<a name="line.862"></a>
866 <FONT color="green">863</FONT> * &lt;p&gt;<a name="line.863"></a>
867 <FONT color="green">864</FONT> * Multiply the value of this fraction by the passed &lt;tt&gt;int&lt;/tt&gt;, returning<a name="line.864"></a>
868 <FONT color="green">865</FONT> * the result in reduced form.<a name="line.865"></a>
869 <FONT color="green">866</FONT> * &lt;/p&gt;<a name="line.866"></a>
870 <FONT color="green">867</FONT> *<a name="line.867"></a>
871 <FONT color="green">868</FONT> * @param i<a name="line.868"></a>
872 <FONT color="green">869</FONT> * the &lt;tt&gt;int&lt;/tt&gt; to multiply by.<a name="line.869"></a>
873 <FONT color="green">870</FONT> * @return a {@link BigFraction} instance with the resulting values.<a name="line.870"></a>
874 <FONT color="green">871</FONT> */<a name="line.871"></a>
875 <FONT color="green">872</FONT> public BigFraction multiply(final int i) {<a name="line.872"></a>
876 <FONT color="green">873</FONT> return multiply(BigInteger.valueOf(i));<a name="line.873"></a>
877 <FONT color="green">874</FONT> }<a name="line.874"></a>
878 <FONT color="green">875</FONT> <a name="line.875"></a>
879 <FONT color="green">876</FONT> /**<a name="line.876"></a>
880 <FONT color="green">877</FONT> * &lt;p&gt;<a name="line.877"></a>
881 <FONT color="green">878</FONT> * Multiply the value of this fraction by the passed &lt;tt&gt;long&lt;/tt&gt;,<a name="line.878"></a>
882 <FONT color="green">879</FONT> * returning the result in reduced form.<a name="line.879"></a>
883 <FONT color="green">880</FONT> * &lt;/p&gt;<a name="line.880"></a>
884 <FONT color="green">881</FONT> *<a name="line.881"></a>
885 <FONT color="green">882</FONT> * @param l<a name="line.882"></a>
886 <FONT color="green">883</FONT> * the &lt;tt&gt;long&lt;/tt&gt; to multiply by.<a name="line.883"></a>
887 <FONT color="green">884</FONT> * @return a {@link BigFraction} instance with the resulting values.<a name="line.884"></a>
888 <FONT color="green">885</FONT> */<a name="line.885"></a>
889 <FONT color="green">886</FONT> public BigFraction multiply(final long l) {<a name="line.886"></a>
890 <FONT color="green">887</FONT> return multiply(BigInteger.valueOf(l));<a name="line.887"></a>
891 <FONT color="green">888</FONT> }<a name="line.888"></a>
892 <FONT color="green">889</FONT> <a name="line.889"></a>
893 <FONT color="green">890</FONT> /**<a name="line.890"></a>
894 <FONT color="green">891</FONT> * &lt;p&gt;<a name="line.891"></a>
895 <FONT color="green">892</FONT> * Multiplies the value of this fraction by another, returning the result in<a name="line.892"></a>
896 <FONT color="green">893</FONT> * reduced form.<a name="line.893"></a>
897 <FONT color="green">894</FONT> * &lt;/p&gt;<a name="line.894"></a>
898 <FONT color="green">895</FONT> *<a name="line.895"></a>
899 <FONT color="green">896</FONT> * @param fraction<a name="line.896"></a>
900 <FONT color="green">897</FONT> * the fraction to multiply by, must not be &lt;code&gt;null&lt;/code&gt;.<a name="line.897"></a>
901 <FONT color="green">898</FONT> * @return a {@link BigFraction} instance with the resulting values.<a name="line.898"></a>
902 <FONT color="green">899</FONT> * @throws NullPointerException<a name="line.899"></a>
903 <FONT color="green">900</FONT> * if the fraction is &lt;code&gt;null&lt;/code&gt;.<a name="line.900"></a>
904 <FONT color="green">901</FONT> */<a name="line.901"></a>
905 <FONT color="green">902</FONT> public BigFraction multiply(final BigFraction fraction) {<a name="line.902"></a>
906 <FONT color="green">903</FONT> if (numerator.equals(BigInteger.ZERO) ||<a name="line.903"></a>
907 <FONT color="green">904</FONT> fraction.numerator.equals(BigInteger.ZERO)) {<a name="line.904"></a>
908 <FONT color="green">905</FONT> return ZERO;<a name="line.905"></a>
909 <FONT color="green">906</FONT> }<a name="line.906"></a>
910 <FONT color="green">907</FONT> return new BigFraction(numerator.multiply(fraction.numerator),<a name="line.907"></a>
911 <FONT color="green">908</FONT> denominator.multiply(fraction.denominator));<a name="line.908"></a>
912 <FONT color="green">909</FONT> }<a name="line.909"></a>
913 <FONT color="green">910</FONT> <a name="line.910"></a>
914 <FONT color="green">911</FONT> /**<a name="line.911"></a>
915 <FONT color="green">912</FONT> * &lt;p&gt;<a name="line.912"></a>
916 <FONT color="green">913</FONT> * Return the additive inverse of this fraction, returning the result in<a name="line.913"></a>
917 <FONT color="green">914</FONT> * reduced form.<a name="line.914"></a>
918 <FONT color="green">915</FONT> * &lt;/p&gt;<a name="line.915"></a>
919 <FONT color="green">916</FONT> *<a name="line.916"></a>
920 <FONT color="green">917</FONT> * @return the negation of this fraction.<a name="line.917"></a>
921 <FONT color="green">918</FONT> */<a name="line.918"></a>
922 <FONT color="green">919</FONT> public BigFraction negate() {<a name="line.919"></a>
923 <FONT color="green">920</FONT> return new BigFraction(numerator.negate(), denominator);<a name="line.920"></a>
924 <FONT color="green">921</FONT> }<a name="line.921"></a>
925 <FONT color="green">922</FONT> <a name="line.922"></a>
926 <FONT color="green">923</FONT> /**<a name="line.923"></a>
927 <FONT color="green">924</FONT> * &lt;p&gt;<a name="line.924"></a>
928 <FONT color="green">925</FONT> * Gets the fraction percentage as a &lt;tt&gt;double&lt;/tt&gt;. This calculates the<a name="line.925"></a>
929 <FONT color="green">926</FONT> * fraction as the numerator divided by denominator multiplied by 100.<a name="line.926"></a>
930 <FONT color="green">927</FONT> * &lt;/p&gt;<a name="line.927"></a>
931 <FONT color="green">928</FONT> *<a name="line.928"></a>
932 <FONT color="green">929</FONT> * @return the fraction percentage as a &lt;tt&gt;double&lt;/tt&gt;.<a name="line.929"></a>
933 <FONT color="green">930</FONT> */<a name="line.930"></a>
934 <FONT color="green">931</FONT> public double percentageValue() {<a name="line.931"></a>
935 <FONT color="green">932</FONT> return (numerator.divide(denominator)).multiply(ONE_HUNDRED_DOUBLE).doubleValue();<a name="line.932"></a>
936 <FONT color="green">933</FONT> }<a name="line.933"></a>
937 <FONT color="green">934</FONT> <a name="line.934"></a>
938 <FONT color="green">935</FONT> /**<a name="line.935"></a>
939 <FONT color="green">936</FONT> * &lt;p&gt;<a name="line.936"></a>
940 <FONT color="green">937</FONT> * Returns a &lt;tt&gt;integer&lt;/tt&gt; whose value is<a name="line.937"></a>
941 <FONT color="green">938</FONT> * &lt;tt&gt;(this&lt;sup&gt;exponent&lt;/sup&gt;)&lt;/tt&gt;, returning the result in reduced form.<a name="line.938"></a>
942 <FONT color="green">939</FONT> * &lt;/p&gt;<a name="line.939"></a>
943 <FONT color="green">940</FONT> *<a name="line.940"></a>
944 <FONT color="green">941</FONT> * @param exponent<a name="line.941"></a>
945 <FONT color="green">942</FONT> * exponent to which this &lt;code&gt;BigInteger&lt;/code&gt; is to be<a name="line.942"></a>
946 <FONT color="green">943</FONT> * raised.<a name="line.943"></a>
947 <FONT color="green">944</FONT> * @return &lt;tt&gt;this&lt;sup&gt;exponent&lt;/sup&gt;&lt;/tt&gt;.<a name="line.944"></a>
948 <FONT color="green">945</FONT> */<a name="line.945"></a>
949 <FONT color="green">946</FONT> public BigFraction pow(final int exponent) {<a name="line.946"></a>
950 <FONT color="green">947</FONT> if (exponent &lt; 0) {<a name="line.947"></a>
951 <FONT color="green">948</FONT> return new BigFraction(denominator.pow(-exponent), numerator.pow(-exponent));<a name="line.948"></a>
952 <FONT color="green">949</FONT> }<a name="line.949"></a>
953 <FONT color="green">950</FONT> return new BigFraction(numerator.pow(exponent), denominator.pow(exponent));<a name="line.950"></a>
954 <FONT color="green">951</FONT> }<a name="line.951"></a>
955 <FONT color="green">952</FONT> <a name="line.952"></a>
956 <FONT color="green">953</FONT> /**<a name="line.953"></a>
957 <FONT color="green">954</FONT> * &lt;p&gt;<a name="line.954"></a>
958 <FONT color="green">955</FONT> * Returns a &lt;code&gt;BigFraction&lt;/code&gt; whose value is<a name="line.955"></a>
959 <FONT color="green">956</FONT> * &lt;tt&gt;(this&lt;sup&gt;exponent&lt;/sup&gt;)&lt;/tt&gt;, returning the result in reduced form.<a name="line.956"></a>
960 <FONT color="green">957</FONT> * &lt;/p&gt;<a name="line.957"></a>
961 <FONT color="green">958</FONT> *<a name="line.958"></a>
962 <FONT color="green">959</FONT> * @param exponent<a name="line.959"></a>
963 <FONT color="green">960</FONT> * exponent to which this &lt;code&gt;BigFraction&lt;/code&gt; is to be raised.<a name="line.960"></a>
964 <FONT color="green">961</FONT> * @return &lt;tt&gt;this&lt;sup&gt;exponent&lt;/sup&gt;&lt;/tt&gt; as a &lt;code&gt;BigFraction&lt;/code&gt;.<a name="line.961"></a>
965 <FONT color="green">962</FONT> */<a name="line.962"></a>
966 <FONT color="green">963</FONT> public BigFraction pow(final long exponent) {<a name="line.963"></a>
967 <FONT color="green">964</FONT> if (exponent &lt; 0) {<a name="line.964"></a>
968 <FONT color="green">965</FONT> return new BigFraction(MathUtils.pow(denominator, -exponent),<a name="line.965"></a>
969 <FONT color="green">966</FONT> MathUtils.pow(numerator, -exponent));<a name="line.966"></a>
970 <FONT color="green">967</FONT> }<a name="line.967"></a>
971 <FONT color="green">968</FONT> return new BigFraction(MathUtils.pow(numerator, exponent),<a name="line.968"></a>
972 <FONT color="green">969</FONT> MathUtils.pow(denominator, exponent));<a name="line.969"></a>
973 <FONT color="green">970</FONT> }<a name="line.970"></a>
974 <FONT color="green">971</FONT> <a name="line.971"></a>
975 <FONT color="green">972</FONT> /**<a name="line.972"></a>
976 <FONT color="green">973</FONT> * &lt;p&gt;<a name="line.973"></a>
977 <FONT color="green">974</FONT> * Returns a &lt;code&gt;BigFraction&lt;/code&gt; whose value is<a name="line.974"></a>
978 <FONT color="green">975</FONT> * &lt;tt&gt;(this&lt;sup&gt;exponent&lt;/sup&gt;)&lt;/tt&gt;, returning the result in reduced form.<a name="line.975"></a>
979 <FONT color="green">976</FONT> * &lt;/p&gt;<a name="line.976"></a>
980 <FONT color="green">977</FONT> *<a name="line.977"></a>
981 <FONT color="green">978</FONT> * @param exponent<a name="line.978"></a>
982 <FONT color="green">979</FONT> * exponent to which this &lt;code&gt;BigFraction&lt;/code&gt; is to be raised.<a name="line.979"></a>
983 <FONT color="green">980</FONT> * @return &lt;tt&gt;this&lt;sup&gt;exponent&lt;/sup&gt;&lt;/tt&gt; as a &lt;code&gt;BigFraction&lt;/code&gt;.<a name="line.980"></a>
984 <FONT color="green">981</FONT> */<a name="line.981"></a>
985 <FONT color="green">982</FONT> public BigFraction pow(final BigInteger exponent) {<a name="line.982"></a>
986 <FONT color="green">983</FONT> if (exponent.compareTo(BigInteger.ZERO) &lt; 0) {<a name="line.983"></a>
987 <FONT color="green">984</FONT> final BigInteger eNeg = exponent.negate();<a name="line.984"></a>
988 <FONT color="green">985</FONT> return new BigFraction(MathUtils.pow(denominator, eNeg),<a name="line.985"></a>
989 <FONT color="green">986</FONT> MathUtils.pow(numerator, eNeg));<a name="line.986"></a>
990 <FONT color="green">987</FONT> }<a name="line.987"></a>
991 <FONT color="green">988</FONT> return new BigFraction(MathUtils.pow(numerator, exponent),<a name="line.988"></a>
992 <FONT color="green">989</FONT> MathUtils.pow(denominator, exponent));<a name="line.989"></a>
993 <FONT color="green">990</FONT> }<a name="line.990"></a>
994 <FONT color="green">991</FONT> <a name="line.991"></a>
995 <FONT color="green">992</FONT> /**<a name="line.992"></a>
996 <FONT color="green">993</FONT> * &lt;p&gt;<a name="line.993"></a>
997 <FONT color="green">994</FONT> * Returns a &lt;code&gt;double&lt;/code&gt; whose value is<a name="line.994"></a>
998 <FONT color="green">995</FONT> * &lt;tt&gt;(this&lt;sup&gt;exponent&lt;/sup&gt;)&lt;/tt&gt;, returning the result in reduced form.<a name="line.995"></a>
999 <FONT color="green">996</FONT> * &lt;/p&gt;<a name="line.996"></a>
1000 <FONT color="green">997</FONT> *<a name="line.997"></a>
1001 <FONT color="green">998</FONT> * @param exponent<a name="line.998"></a>
1002 <FONT color="green">999</FONT> * exponent to which this &lt;code&gt;BigFraction&lt;/code&gt; is to be raised.<a name="line.999"></a>
1003 <FONT color="green">1000</FONT> * @return &lt;tt&gt;this&lt;sup&gt;exponent&lt;/sup&gt;&lt;/tt&gt;.<a name="line.1000"></a>
1004 <FONT color="green">1001</FONT> */<a name="line.1001"></a>
1005 <FONT color="green">1002</FONT> public double pow(final double exponent) {<a name="line.1002"></a>
1006 <FONT color="green">1003</FONT> return Math.pow(numerator.doubleValue(), exponent) /<a name="line.1003"></a>
1007 <FONT color="green">1004</FONT> Math.pow(denominator.doubleValue(), exponent);<a name="line.1004"></a>
1008 <FONT color="green">1005</FONT> }<a name="line.1005"></a>
1009 <FONT color="green">1006</FONT> <a name="line.1006"></a>
1010 <FONT color="green">1007</FONT> /**<a name="line.1007"></a>
1011 <FONT color="green">1008</FONT> * &lt;p&gt;<a name="line.1008"></a>
1012 <FONT color="green">1009</FONT> * Return the multiplicative inverse of this fraction.<a name="line.1009"></a>
1013 <FONT color="green">1010</FONT> * &lt;/p&gt;<a name="line.1010"></a>
1014 <FONT color="green">1011</FONT> *<a name="line.1011"></a>
1015 <FONT color="green">1012</FONT> * @return the reciprocal fraction.<a name="line.1012"></a>
1016 <FONT color="green">1013</FONT> */<a name="line.1013"></a>
1017 <FONT color="green">1014</FONT> public BigFraction reciprocal() {<a name="line.1014"></a>
1018 <FONT color="green">1015</FONT> return new BigFraction(denominator, numerator);<a name="line.1015"></a>
1019 <FONT color="green">1016</FONT> }<a name="line.1016"></a>
1020 <FONT color="green">1017</FONT> <a name="line.1017"></a>
1021 <FONT color="green">1018</FONT> /**<a name="line.1018"></a>
1022 <FONT color="green">1019</FONT> * &lt;p&gt;<a name="line.1019"></a>
1023 <FONT color="green">1020</FONT> * Reduce this &lt;code&gt;BigFraction&lt;/code&gt; to its lowest terms.<a name="line.1020"></a>
1024 <FONT color="green">1021</FONT> * &lt;/p&gt;<a name="line.1021"></a>
1025 <FONT color="green">1022</FONT> *<a name="line.1022"></a>
1026 <FONT color="green">1023</FONT> * @return the reduced &lt;code&gt;BigFraction&lt;/code&gt;. It doesn't change anything if<a name="line.1023"></a>
1027 <FONT color="green">1024</FONT> * the fraction can be reduced.<a name="line.1024"></a>
1028 <FONT color="green">1025</FONT> */<a name="line.1025"></a>
1029 <FONT color="green">1026</FONT> public BigFraction reduce() {<a name="line.1026"></a>
1030 <FONT color="green">1027</FONT> final BigInteger gcd = numerator.gcd(denominator);<a name="line.1027"></a>
1031 <FONT color="green">1028</FONT> return new BigFraction(numerator.divide(gcd), denominator.divide(gcd));<a name="line.1028"></a>
1032 <FONT color="green">1029</FONT> }<a name="line.1029"></a>
1033 <FONT color="green">1030</FONT> <a name="line.1030"></a>
1034 <FONT color="green">1031</FONT> /**<a name="line.1031"></a>
1035 <FONT color="green">1032</FONT> * &lt;p&gt;<a name="line.1032"></a>
1036 <FONT color="green">1033</FONT> * Subtracts the value of an {@link BigInteger} from the value of this one,<a name="line.1033"></a>
1037 <FONT color="green">1034</FONT> * returning the result in reduced form.<a name="line.1034"></a>
1038 <FONT color="green">1035</FONT> * &lt;/p&gt;<a name="line.1035"></a>
1039 <FONT color="green">1036</FONT> *<a name="line.1036"></a>
1040 <FONT color="green">1037</FONT> * @param bg<a name="line.1037"></a>
1041 <FONT color="green">1038</FONT> * the {@link BigInteger} to subtract, must'nt be<a name="line.1038"></a>
1042 <FONT color="green">1039</FONT> * &lt;code&gt;null&lt;/code&gt;.<a name="line.1039"></a>
1043 <FONT color="green">1040</FONT> * @return a &lt;code&gt;BigFraction&lt;/code&gt; instance with the resulting values.<a name="line.1040"></a>
1044 <FONT color="green">1041</FONT> * @throws NullPointerException<a name="line.1041"></a>
1045 <FONT color="green">1042</FONT> * if the {@link BigInteger} is &lt;code&gt;null&lt;/code&gt;.<a name="line.1042"></a>
1046 <FONT color="green">1043</FONT> */<a name="line.1043"></a>
1047 <FONT color="green">1044</FONT> public BigFraction subtract(final BigInteger bg) {<a name="line.1044"></a>
1048 <FONT color="green">1045</FONT> return new BigFraction(numerator.subtract(denominator.multiply(bg)), denominator);<a name="line.1045"></a>
1049 <FONT color="green">1046</FONT> }<a name="line.1046"></a>
1050 <FONT color="green">1047</FONT> <a name="line.1047"></a>
1051 <FONT color="green">1048</FONT> /**<a name="line.1048"></a>
1052 <FONT color="green">1049</FONT> * &lt;p&gt;<a name="line.1049"></a>
1053 <FONT color="green">1050</FONT> * Subtracts the value of an &lt;tt&gt;integer&lt;/tt&gt; from the value of this one,<a name="line.1050"></a>
1054 <FONT color="green">1051</FONT> * returning the result in reduced form.<a name="line.1051"></a>
1055 <FONT color="green">1052</FONT> * &lt;/p&gt;<a name="line.1052"></a>
1056 <FONT color="green">1053</FONT> *<a name="line.1053"></a>
1057 <FONT color="green">1054</FONT> * @param i<a name="line.1054"></a>
1058 <FONT color="green">1055</FONT> * the &lt;tt&gt;integer&lt;/tt&gt; to subtract.<a name="line.1055"></a>
1059 <FONT color="green">1056</FONT> * @return a &lt;code&gt;BigFraction&lt;/code&gt; instance with the resulting values.<a name="line.1056"></a>
1060 <FONT color="green">1057</FONT> */<a name="line.1057"></a>
1061 <FONT color="green">1058</FONT> public BigFraction subtract(final int i) {<a name="line.1058"></a>
1062 <FONT color="green">1059</FONT> return subtract(BigInteger.valueOf(i));<a name="line.1059"></a>
1063 <FONT color="green">1060</FONT> }<a name="line.1060"></a>
1064 <FONT color="green">1061</FONT> <a name="line.1061"></a>
1065 <FONT color="green">1062</FONT> /**<a name="line.1062"></a>
1066 <FONT color="green">1063</FONT> * &lt;p&gt;<a name="line.1063"></a>
1067 <FONT color="green">1064</FONT> * Subtracts the value of an &lt;tt&gt;integer&lt;/tt&gt; from the value of this one,<a name="line.1064"></a>
1068 <FONT color="green">1065</FONT> * returning the result in reduced form.<a name="line.1065"></a>
1069 <FONT color="green">1066</FONT> * &lt;/p&gt;<a name="line.1066"></a>
1070 <FONT color="green">1067</FONT> *<a name="line.1067"></a>
1071 <FONT color="green">1068</FONT> * @param l<a name="line.1068"></a>
1072 <FONT color="green">1069</FONT> * the &lt;tt&gt;long&lt;/tt&gt; to subtract.<a name="line.1069"></a>
1073 <FONT color="green">1070</FONT> * @return a &lt;code&gt;BigFraction&lt;/code&gt; instance with the resulting values, or<a name="line.1070"></a>
1074 <FONT color="green">1071</FONT> * this object if the &lt;tt&gt;long&lt;/tt&gt; is zero.<a name="line.1071"></a>
1075 <FONT color="green">1072</FONT> */<a name="line.1072"></a>
1076 <FONT color="green">1073</FONT> public BigFraction subtract(final long l) {<a name="line.1073"></a>
1077 <FONT color="green">1074</FONT> return subtract(BigInteger.valueOf(l));<a name="line.1074"></a>
1078 <FONT color="green">1075</FONT> }<a name="line.1075"></a>
1079 <FONT color="green">1076</FONT> <a name="line.1076"></a>
1080 <FONT color="green">1077</FONT> /**<a name="line.1077"></a>
1081 <FONT color="green">1078</FONT> * &lt;p&gt;<a name="line.1078"></a>
1082 <FONT color="green">1079</FONT> * Subtracts the value of another fraction from the value of this one,<a name="line.1079"></a>
1083 <FONT color="green">1080</FONT> * returning the result in reduced form.<a name="line.1080"></a>
1084 <FONT color="green">1081</FONT> * &lt;/p&gt;<a name="line.1081"></a>
1085 <FONT color="green">1082</FONT> *<a name="line.1082"></a>
1086 <FONT color="green">1083</FONT> * @param fraction<a name="line.1083"></a>
1087 <FONT color="green">1084</FONT> * the {@link BigFraction} to subtract, must not be<a name="line.1084"></a>
1088 <FONT color="green">1085</FONT> * &lt;code&gt;null&lt;/code&gt;.<a name="line.1085"></a>
1089 <FONT color="green">1086</FONT> * @return a {@link BigFraction} instance with the resulting values<a name="line.1086"></a>
1090 <FONT color="green">1087</FONT> * @throws NullPointerException<a name="line.1087"></a>
1091 <FONT color="green">1088</FONT> * if the fraction is &lt;code&gt;null&lt;/code&gt;.<a name="line.1088"></a>
1092 <FONT color="green">1089</FONT> */<a name="line.1089"></a>
1093 <FONT color="green">1090</FONT> public BigFraction subtract(final BigFraction fraction) {<a name="line.1090"></a>
1094 <FONT color="green">1091</FONT> if (ZERO.equals(fraction)) {<a name="line.1091"></a>
1095 <FONT color="green">1092</FONT> return this;<a name="line.1092"></a>
1096 <FONT color="green">1093</FONT> }<a name="line.1093"></a>
1097 <FONT color="green">1094</FONT> <a name="line.1094"></a>
1098 <FONT color="green">1095</FONT> BigInteger num = null;<a name="line.1095"></a>
1099 <FONT color="green">1096</FONT> BigInteger den = null;<a name="line.1096"></a>
1100 <FONT color="green">1097</FONT> if (denominator.equals(fraction.denominator)) {<a name="line.1097"></a>
1101 <FONT color="green">1098</FONT> num = numerator.subtract(fraction.numerator);<a name="line.1098"></a>
1102 <FONT color="green">1099</FONT> den = denominator;<a name="line.1099"></a>
1103 <FONT color="green">1100</FONT> } else {<a name="line.1100"></a>
1104 <FONT color="green">1101</FONT> num = (numerator.multiply(fraction.denominator)).subtract((fraction.numerator).multiply(denominator));<a name="line.1101"></a>
1105 <FONT color="green">1102</FONT> den = denominator.multiply(fraction.denominator);<a name="line.1102"></a>
1106 <FONT color="green">1103</FONT> }<a name="line.1103"></a>
1107 <FONT color="green">1104</FONT> return new BigFraction(num, den);<a name="line.1104"></a>
1108 <FONT color="green">1105</FONT> <a name="line.1105"></a>
1109 <FONT color="green">1106</FONT> }<a name="line.1106"></a>
1110 <FONT color="green">1107</FONT> <a name="line.1107"></a>
1111 <FONT color="green">1108</FONT> /**<a name="line.1108"></a>
1112 <FONT color="green">1109</FONT> * &lt;p&gt;<a name="line.1109"></a>
1113 <FONT color="green">1110</FONT> * Returns the &lt;code&gt;String&lt;/code&gt; representing this fraction, ie<a name="line.1110"></a>
1114 <FONT color="green">1111</FONT> * "num / dem" or just "num" if the denominator is one.<a name="line.1111"></a>
1115 <FONT color="green">1112</FONT> * &lt;/p&gt;<a name="line.1112"></a>
1116 <FONT color="green">1113</FONT> *<a name="line.1113"></a>
1117 <FONT color="green">1114</FONT> * @return a string representation of the fraction.<a name="line.1114"></a>
1118 <FONT color="green">1115</FONT> * @see java.lang.Object#toString()<a name="line.1115"></a>
1119 <FONT color="green">1116</FONT> */<a name="line.1116"></a>
1120 <FONT color="green">1117</FONT> @Override<a name="line.1117"></a>
1121 <FONT color="green">1118</FONT> public String toString() {<a name="line.1118"></a>
1122 <FONT color="green">1119</FONT> String str = null;<a name="line.1119"></a>
1123 <FONT color="green">1120</FONT> if (BigInteger.ONE.equals(denominator)) {<a name="line.1120"></a>
1124 <FONT color="green">1121</FONT> str = numerator.toString();<a name="line.1121"></a>
1125 <FONT color="green">1122</FONT> } else if (BigInteger.ZERO.equals(numerator)) {<a name="line.1122"></a>
1126 <FONT color="green">1123</FONT> str = "0";<a name="line.1123"></a>
1127 <FONT color="green">1124</FONT> } else {<a name="line.1124"></a>
1128 <FONT color="green">1125</FONT> str = numerator + " / " + denominator;<a name="line.1125"></a>
1129 <FONT color="green">1126</FONT> }<a name="line.1126"></a>
1130 <FONT color="green">1127</FONT> return str;<a name="line.1127"></a>
1131 <FONT color="green">1128</FONT> }<a name="line.1128"></a>
1132 <FONT color="green">1129</FONT> <a name="line.1129"></a>
1133 <FONT color="green">1130</FONT> /** {@inheritDoc} */<a name="line.1130"></a>
1134 <FONT color="green">1131</FONT> public BigFractionField getField() {<a name="line.1131"></a>
1135 <FONT color="green">1132</FONT> return BigFractionField.getInstance();<a name="line.1132"></a>
1136 <FONT color="green">1133</FONT> }<a name="line.1133"></a>
1137 <FONT color="green">1134</FONT> <a name="line.1134"></a>
1138 <FONT color="green">1135</FONT> }<a name="line.1135"></a>
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199 </PRE>
1200 </BODY>
1201 </HTML>