Author: moritz
Date: 2009-10-04 19:15:53 +0200 (Sun, 04 Oct 2009)
New Revision: 28597
Modified:
docs/Perl6/Spec/S32-setting-library/Numeric.pod
Log:
[S32/Numeric] major overhaul
* Most methods that were in Num are now Numeric
* sign() and the rounding methods are now in Real
* document (at least partially) Rat, Num and Int
Modified: docs/Perl6/Spec/S32-setting-library/Numeric.pod
===================================================================
--- docs/Perl6/Spec/S32-setting-library/Numeric.pod 2009-10-04 17:15:43 UTC
(rev 28596)
+++ docs/Perl6/Spec/S32-setting-library/Numeric.pod 2009-10-04 17:15:53 UTC
(rev 28597)
@@ -28,7 +28,7 @@
repository under /docs/Perl6/Spec/S32-setting-library/Numeric.pod so edit it
there in
the SVN repository if you would like to make changes.
-This documents Bit, Int, Num, Rat, Complex, and Bool.
+This documents Bit, Int, Numeric, Rat, Complex, and Bool.
XXX So where are Bit, Int, and Rat
@@ -52,13 +52,17 @@
=back
-=head2 Num
+=head2 Numeric
-The following are all defined in the C<Num> role:
+C<Numeric> is a role for everything that's a scalar number. So C<Num>, C<Int>,
+C<Rat>, C<Complex> and other numeric types do that role. However it is an
+abstract interface, so C<$number.WHAT> will never return C<Numeric>. Users who
+provide their own scalar numeric types are encouraged to implement the
+C<Numeric> role.
-B<API document>: L<Num>
+The following are all defined in the C<Numeric> role:
-C<Num> provides some constants in addition to the basic
+C<Numeric> provides some constants in addition to the basic
mathematical functions.
constant pi is export = 3.14159_26535_89793_23846_26433_83279_50288;
@@ -68,74 +72,43 @@
=item succ
- our Num multi method succ ( Num $x: ) is export
- our Int multi method succ ( Int $x: ) is export
+ our Numeric multi method succ ( Numeric $x: ) is export
+ our Int multi method succ ( Int $x: ) is export
Returns the successor of C<$x>. This method is used by C<< prefix:<++> >> and
C<< postfix:<++> >> to increment the value in a container.
=item pred
- our Num multi method pred ( Num $x: ) is export
- our Int multi method pred ( Int $x: ) is export
+ our Numeric multi method pred ( Numeric $x: ) is export
+ our Int multi method pred ( Int $x: ) is export
Returns the predeccessor of C<$x>. This method is used by C<< prefix:<--> >>
and C<< postfix:<--> >> to decrement the value in a container.
=item abs
- our Num multi method abs ( Num $x: ) is export
+ our Numeric multi method abs ( Numeric $x: ) is export
Absolute Value.
-=item floor
-
- our Int multi method floor ( Num $x: ) is export
-
-Returns the highest integer not greater than C<$x>.
-
-=item ceiling
-
- our Int multi method ceiling ( Num $x: ) is export
-
-Returns the lowest integer not less than C<$x>.
-
-=item round
-
- our Int multi method round ( Num $x: ) is export
-
-Returns the nearest integer to C<$x>. The algorithm is C<floor($x + 0.5)>.
-(Other rounding algorithms will be given extended names beginning with
"round".)
-
-=item truncate
-
- our Int multi method truncate ( Num $x: ) is export
-
-Returns the closest integer to C<$x> whose absolute value is not greater
-than the absolute value of C<$x>. (In other words, just chuck any
-fractional part.) This is the default rounding function used by
-implicit integer conversions.
-
-You may also truncate using explicit integer casts, either C<Int()> for
-an arbitrarily large integers, or C<int()> for native integers.
-
=item exp
- our Num multi method exp ( Num $exponent: Num :$base = Num::e ) is export
+ our Numeric multi method exp ( Numeric $exponent: Numeric :$base = Num::e )
is export
Performs similar to C<$base ** $exponent>. C<$base> defaults to the
constant I<e>.
=item log
- our Num multi method log ( Num $x: Num $base = Num::e ) is export
+ our Numeric multi method log ( Numeric $x: Numeric $base = Num::e ) is export
Logarithm of base C<$base>, default Natural. Calling with C<$x == 0> is an
error.
=item log10
- our Num multi method log10 (Num $x:) is export
+ our Numeric multi method log10 (Numeric $x:) is export
A base C<10> logarithm, othewise identical to C<log>.
@@ -148,34 +121,9 @@
unary C<rand> function in PerlĀ 6, so just multiply C<rand> by your
desired multiplier. For picking a random integer you probably want
to use something like C<(1..6).pick> instead.
-
-=item sign
-
- our Int multi method sign ( Num $x: ) is export
-
-Returns 1 when C<$x> is greater than 0, -1 when it is less than 0, 0 when it
-is equal to 0, or undefined when the value passed is undefined.
-
-=item srand
-
- multi method srand ( Num $seed: )
- multi srand ( Num $seed = default_seed_algorithm())
-
-Seed the generator C<rand> uses. C<$seed> defaults to some combination
-of various platform dependent characteristics to yield a non-deterministic
seed.
-Note that you get one C<srand()> for free when you start a Perl program, so
-you I<must> call C<srand()> yourself if you wish to specify a deterministic
seed
-(or if you wish to be differently nondeterministic).
-
-=item sqrt
-
- our Num multi method sqrt ( Num $x: ) is export
-
-Returns the square root of the parameter.
-
=item roots
- (in Num) method roots (Numeric $x: Int $n --> List of Num) is export
+ method roots (Numeric $x: Int $n --> List of Num) is export
Returns a list of all C<$n>th (complex) roots of C<$x>. Returns C<NaN> if
C<< $n <= 0 >>, itself if C<$n == 0>, and is free to return a single C<NaN>
@@ -184,13 +132,13 @@
=item cis
- our Complex multi method cis (Num $angle:) is export
+ our Complex multi method cis (Real $angle:) is export
Returns 1.unpolar($angle)
=item unpolar
- our Complex multi method unpolar (Num $mag: Num $angle) is export
+ our Complex multi method unpolar (Real $mag: Real $angle) is export
Returns a complex number specified in polar coordinates. Angle is in radians.
@@ -208,6 +156,80 @@
=back
+=head2 Real
+
+ role Real does Numeric;
+
+C<Real>, like C<Numeric>, is an abstract role that represents the interface of
+a real scalar number (ie neither C<Complex> nor vector-like). For example
+C<Num>, C<Int>, C<Bool> and C<Rat> implement the C<Real> role.
+
+=over
+
+=item floor
+
+ our Int multi method floor ( Real $x: ) is export
+
+Returns the highest integer not greater than C<$x>.
+
+=item ceiling
+
+ our Int multi method ceiling ( Real $x: ) is export
+
+Returns the lowest integer not less than C<$x>.
+
+=item round
+
+ our Int multi method round ( Real $x: ) is export
+
+Returns the nearest integer to C<$x>. The algorithm is C<floor($x + 0.5)>.
+(Other rounding algorithms will be given extended names beginning with
"round".)
+
+=item truncate
+
+ our Int multi method truncate ( Real $x: ) is export
+
+Returns the closest integer to C<$x> whose absolute value is not greater
+than the absolute value of C<$x>. (In other words, just chuck any
+fractional part.) This is the default rounding function used by
+implicit integer conversions.
+
+You may also truncate using explicit integer casts, either C<Int()> for
+an arbitrarily large integers, or C<int()> for native integers.
+
+=item sign
+
+ our Int multi method sign ( Real $x: ) is export
+
+Returns 1 when C<$x> is greater than 0, -1 when it is less than 0, 0 when it
+is equal to 0, or undefined when the value passed is undefined.
+
+=item srand
+
+ multi method srand ( Real $seed: )
+ multi srand ( Real $seed = default_seed_algorithm())
+
+Seed the generator C<rand> uses. C<$seed> defaults to some combination
+of various platform dependent characteristics to yield a non-deterministic
seed.
+Note that you get one C<srand()> for free when you start a Perl program, so
+you I<must> call C<srand()> yourself if you wish to specify a deterministic
seed
+(or if you wish to be differently nondeterministic).
+
+=item sqrt
+
+ our Real multi method sqrt ( Real $x: ) is export
+
+Returns the square root of the parameter.
+
+
+=back
+
+=head2 Num
+
+ class Num does Real;
+
+C<Num> is a machine-precision numeric real value.
+
=head2 Complex
C<Complex> is an immutable type. Each C<Complex> object stores two numbers,
@@ -222,6 +244,13 @@
=over 4
+=item new
+
+ our Complex multi method new(Real $re, Real $im)
+
+Constructs a C<Complex> number from real and imaginary part. This is the
+method form of C<$re + ($im)i>.
+
=item polar
our Seq multi method polar (Complex $nim:) is export
@@ -245,7 +274,7 @@
=head2 Trigonometric functions
-The following are also defined in C<Num>. The trig functions
+The following are also defined in C<Numeric>. The trig functions
depend on the current (lexically scoped) trig base:
enum TrigBase is export <Radians Degrees Gradians Circles>;
@@ -255,7 +284,7 @@
=item I<Standard Trig Functions>
- Num multi method func ( Num $x: TrigBase $base = $?TRIGBASE ) is export
+ Nuermic multi method func ( Nuermic $x: TrigBase $base = $?TRIGBASE ) is
export
where I<func> is one of:
sin, cos, tan, asin, acos, atan, sec, cosec, cotan, asec, acosec,
@@ -281,14 +310,58 @@
=item atan2
- our Num multi method atan2 ( Num $y: Num $x = 1 )
- our Num multi atan2 ( Num $y, Num $x = 1 )
+ our Nuermic multi method atan2 ( Nuermic $y: Nuermic $x = 1 )
+ our Nuermic multi atan2 ( Nuermic $y, Nuermic $x = 1 )
This second form of C<atan> computes the arctangent of C<$y/$x>, and takes
the quadrant into account. Otherwise behaves as other trigonometric functions.
=back
+=head2 Int
+
+An C<Int> is an immutable, integral number of arbitrary size.
+
+=head2 Rat
+
+ class Rat does Real;
+
+An immutable rational number, represented by two C<Int>s, a numerator and
+a denominator. All interface methods return values as if the numerator and
+denominator were stored in a normal form: both numerator and denominator are
+minimal in their magnitude, and the denominator is positive. So
+C<Rat.new(2, -4).denominator> return C<2>, because the normal form is C<-1/2>.
+
+=over
+
+=item new
+
+ multi method new(Int $num, Int $denom)
+
+Constructs a C<Rat> object from the numerator and denominator.
+Fails if C<$denom == 0>.
+
+=item nude
+
+ our Seq[Int] multi method nude()
+
+Returns a C<Seq> of numerator and denominator
+
+=item denominator
+
+ our Int multi method denominator()
+
+Returns the denominator
+
+=item numerator
+
+ our Int multi method numerator()
+
+Returns the numerator
+
+=back
+
+
=head1 Additions
Please post errors and feedback to perl6-language. If you are making