[pure-lang-svn] SF.net SVN: pure-lang:[583] pure/trunk/lib/math.pure
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-08-23 20:50:12
|
Revision: 583 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=583&view=rev Author: agraef Date: 2008-08-23 20:50:22 +0000 (Sat, 23 Aug 2008) Log Message: ----------- Add type guards to rational operations. Modified Paths: -------------- pure/trunk/lib/math.pure Modified: pure/trunk/lib/math.pure =================================================================== --- pure/trunk/lib/math.pure 2008-08-23 12:56:48 UTC (rev 582) +++ pure/trunk/lib/math.pure 2008-08-23 20:50:22 UTC (rev 583) @@ -349,8 +349,10 @@ // rational operands (x1%y1)%(x2%y2) = (x1*y2)%(y1*x2); -(x1%y1)%x2 = x1%(y1*x2); -x1%(x2%y2) = (x1*y2)%x2; +(x1%y1)%x2::int | +(x1%y1)%x2::bigint = x1%(y1*x2); +x1::int%(x2%y2) | +x1::bigint%(x2%y2) = (x1*y2)%x2; // complex operands (these must both use the same representation, otherwise // the result won't be exact) @@ -358,15 +360,19 @@ z1@(_<:_)%z2@(_+:_) = z1/z2; (x1+:y1)%(x2+:y2) = (x1*x2+y1*y2)%d +: (y1*x2-x1*y2)%d when d = x2*x2+y2*y2 end; -(x1+:y1)%x2 = (x1*x2)%d +: (y1*x2)%d when d = x2*x2 end; -x1%(x2+:y2) = (x1*x2)%d +: (-x1*y2)%d when d = x2*x2+y2*y2 end; (r1<:t1)%(r2<:t2) = r1%r2 <: t1-t2; -(r1<:t1)%x2 = r1%x2 <: t1; -x1%(r2<:t2) = x1%r2 <: -t2; +// mixed complex/real cases +(x1+:y1)%x2 = (x1*x2)%d +: (y1*x2)%d + when d = x2*x2 end if realp x2; +x1%(x2+:y2) = (x1*x2)%d +: (-x1*y2)%d + when d = x2*x2+y2*y2 end if realp x1; +(r1<:t1)%x2 = r1%x2 <: t1 if realp x2; +x1%(r2<:t2) = x1%r2 <: -t2 if realp x1; + // fall back to ordinary inexact division in all other cases -x::double%y | -x%y::double = x/y; +x::double%y = x/y if numberp y; +x%y::double = x/y if numberp x; /* Conversions. */ @@ -484,24 +490,37 @@ (x1%y1)-(x2%y2) = (x1*y2-x2*y1) % (y1*y2); (x1%y1)*(x2%y2) = (x1*x2) % (y1*y2); -(x1%y1)+x2 = (x1+x2*y1) % y1; -(x1%y1)-x2 = (x1-x2*y1) % y1; -(x1%y1)*x2 = (x1*x2) % y1; +(x1%y1)+x2::int | +(x1%y1)+x2::bigint = (x1+x2*y1) % y1; +(x1%y1)-x2::int | +(x1%y1)-x2::bigint = (x1-x2*y1) % y1; +(x1%y1)*x2::int | +(x1%y1)*x2::bigint = (x1*x2) % y1; -x1+(x2%y2) = (x1*y2+x2) % y2; -x1-(x2%y2) = (x1*y2-x2) % y2; -x1*(x2%y2) = (x1*x2) % y2; +x1::int+(x2%y2) | +x1::bigint+(x2%y2) = (x1*y2+x2) % y2; +x1::int-(x2%y2) | +x1::bigint-(x2%y2) = (x1*y2-x2) % y2; +x1::int*(x2%y2) | +x1::bigint*(x2%y2) = (x1*x2) % y2; -/* / and ^ yield inexact results. */ +/* Fallback rules. */ -(x1%y1)/(x2%y2) = (x1*y2) / (y1*x2); +// / and ^ always yield inexact results. +(x1%y1)/(x2%y2) = (x1/y1) / (x2/y2); (x1%y1)^(x2%y2) = (x1/y1) ^ (x2/y2); -(x1%y1)/x2 = x1 / (y1*x2); -(x1%y1)^x2 = (x1/y1) ^ x2; +(x1%y1)+x2 = (x1/y1)+x2 if numberp x2; +(x1%y1)-x2 = (x1/y1)-x2 if numberp x2; +(x1%y1)*x2 = (x1/y1)*x2 if numberp x2; +(x1%y1)/x2 = (x1/y1)/x2 if numberp x2; +(x1%y1)^x2 = (x1/y1)^x2 if numberp x2; -x1/(x2%y2) = (x1*y2) / x2; -x1^(x2%y2) = x1 ^ (x2/y2); +x1+(x2%y2) = x1+(x2/y2) if numberp x1; +x1-(x2%y2) = x1-(x2/y2) if numberp x1; +x1*(x2%y2) = x1*(x2/y2) if numberp x1; +x1/(x2%y2) = x1/(x2/y2) if numberp x1; +x1^(x2%y2) = x1^(x2/y2) if numberp x1; /* Comparisons. */ @@ -512,19 +531,19 @@ x1%y1 > x2%y2 = x1*y2 > x2*y1; x1%y1 >= x2%y2 = x1*y2 >= x2*y1; -x1%y1 == x2 = x1 == x2*y1; -x1%y1 != x2 = x1 != x2*y1; -x1%y1 < x2 = x1 < x2*y1; -x1%y1 <= x2 = x1 <= x2*y1; -x1%y1 > x2 = x1 > x2*y1; -x1%y1 >= x2 = x1 >= x2*y1; +x1%y1 == x2 = x1 == x2*y1 if numberp x2; +x1%y1 != x2 = x1 != x2*y1 if numberp x2; +x1%y1 < x2 = x1 < x2*y1 if realp x2; +x1%y1 <= x2 = x1 <= x2*y1 if realp x2; +x1%y1 > x2 = x1 > x2*y1 if realp x2; +x1%y1 >= x2 = x1 >= x2*y1 if realp x2; -x1 == x2%y2 = x1*y2 == x2; -x1 != x2%y2 = x1*y2 != x2; -x1 < x2%y2 = x1*y2 < x2; -x1 <= x2%y2 = x1*y2 <= x2; -x1 > x2%y2 = x1*y2 > x2; -x1 >= x2%y2 = x1*y2 >= x2; +x1 == x2%y2 = x1*y2 == x2 if numberp x2; +x1 != x2%y2 = x1*y2 != x2 if numberp x2; +x1 < x2%y2 = x1*y2 < x2 if realp x2; +x1 <= x2%y2 = x1*y2 <= x2 if realp x2; +x1 > x2%y2 = x1*y2 > x2 if realp x2; +x1 >= x2%y2 = x1*y2 >= x2 if realp x2; /* Additional number predicates. */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |