Author: lwall
Date: 2009-11-17 18:28:47 +0100 (Tue, 17 Nov 2009)
New Revision: 29110
Modified:
docs/Perl6/Spec/S02-bits.pod
docs/Perl6/Spec/S09-data.pod
Log:
[S02,S09] break the assumption that Rats should be symmetrical
Add Ratio for performance-destroying but truly arbitrary-precision rationals
rename STASH to Stash for consistency
Modified: docs/Perl6/Spec/S02-bits.pod
===================================================================
--- docs/Perl6/Spec/S02-bits.pod 2009-11-17 16:09:39 UTC (rev 29109)
+++ docs/Perl6/Spec/S02-bits.pod 2009-11-17 17:28:47 UTC (rev 29110)
@@ -13,8 +13,8 @@
Created: 10 Aug 2004
- Last Modified: 09 Nov 2009
- Version: 187
+ Last Modified: 17 Nov 2009
+ Version: 188
This document summarizes Apocalypse 2, which covers small-scale
lexical items and typological issues. (These Synopses also contain
@@ -674,13 +674,23 @@
However, for pragmatic reasons, C<Rat> values are guaranteed to be
exact only up to a certain point. By default, this is the precision
-that would be represented by a C<rat64> type, that is, with a numerator
-and denominator consisting of C<int64> values. C<Rat>s that would require
-more than 64 bits of storage in either numerator or denominator are
-automatically converted to C<Num>s. (If rationals are defined by a
-role, it may be possible to instantiate a C<Rat> type with a different
-maximum precision.)
+that would be represented by the C<Rat64> type, which has a numerator
+of C<Int> but is limited to a denominator of C<int64>. A C<Rat64> that
+would require more than 64 bits of storage in the denominator is
+automatically converted either to a C<Num> or to a lesser-precision
+C<Rat>, at the discretion of the implementation. (Native types such
+as C<rat64> limit the size of both numerator and denominator, though
+not to the same size. The numerator should in general be twice the
+size of the denominator to support user expectations. For instance,
+a C<rat8> should actually support C<int16/int8>, allowing
+numbers like C<100.01> to be represented, and a C<rat64>,
+defined as C<int128/int64>, can hold the number of seconds since
+the Big Bang with picosecond precision. Though perhaps not with
+picosecond accuracy...)
+For applications that really need arbitrary precision denominators
+as well as numerators, C<Ratio> may be used, which is defined as C<Int/Int>.
+
=item *
PerlĀ 6 should by default make standard IEEE floating point concepts
@@ -959,6 +969,7 @@
int native signed integer
uint native unsigned integer (autoboxes to Int)
buf native buffer (finite seq of native ints or uints, no Unicode)
+ rat native rational
num native floating point
complex native complex number
bool native boolean
@@ -1073,8 +1084,9 @@
Str Perl string (finite sequence of Unicode characters)
Bit Perl single bit (allows traits, aliasing, undef, etc.)
Int Perl integer (allows Inf/NaN, arbitrary precision, etc.)
- Num Perl number (approximate Real)
- Rat Perl rational (exact Real)
+ Num Perl number (approximate Real, generally via floating point)
+ Rat Perl rational (exact Real, limited denominator)
+ Ratio Perl rational (unlimited precision in both parts)
Complex Perl complex number
Bool Perl boolean
Exception Perl exception
@@ -1115,7 +1127,8 @@
native TAI value. In numeric context a C<Duration> happily returns a
C<Num> representing seconds. If pressed for a number, an C<Instant>
will return the length of time in atomic seconds from the TAI epoch,
-but it will be unhappy about it. Systems which cannot provide
+but it will be unhappy about it. (The time will be returned as a C<Rat>
+to preserve maximal precision and accuracy.) Systems which cannot provide
a steady time base, such as POSIX systems, will simply have to make
their best guess as to the correct atomic time.
@@ -1128,6 +1141,7 @@
Int Numeric Integral
Num Numeric Real
Rat Numeric Real
+ Ratio Numeric Real
Complex Numeric
Bool Boolean
Exception Failure
@@ -1169,7 +1183,7 @@
Macro Perl compile-time subroutine
Regex Perl pattern
Match Perl match, usually produced by applying a pattern
- STASH A symbol table hash (package, module, class, lexpad, etc)
+ Stash A symbol table hash (package, module, class, lexpad, etc)
SoftRoutine A routine that is committed to staying mutable
The C<KeyHash> role differs from a normal C<Associative> hash in how it
handles default
@@ -1231,7 +1245,7 @@
Macro Callable
Regex Callable
Match Positional Associative
- STASH Associative
+ Stash Associative
SoftRoutine Routine
See L<S06/"Wrapping"> for a discussion of soft vs. hard routines.
Modified: docs/Perl6/Spec/S09-data.pod
===================================================================
--- docs/Perl6/Spec/S09-data.pod 2009-11-17 16:09:39 UTC (rev 29109)
+++ docs/Perl6/Spec/S09-data.pod 2009-11-17 17:28:47 UTC (rev 29110)
@@ -13,8 +13,8 @@
Created: 13 Sep 2004
- Last Modified: 21 Sep 2009
- Version: 35
+ Last Modified: 17 Nov 2009
+ Version: 36
=head1 Overview
@@ -81,6 +81,9 @@
run-time system (presumably Parrot) is compiled in. So C<int>
typically means C<int32> or C<int64>, while C<num> usually means
C<num64>, and C<complex> means two of whatever C<num> turns out to be.
+For symmetry around the decimal point, native rats have a numerator
+that is twice the size of their denominator, such that a rat32 actually
+has an int64 for its numerator.
You are, of course, free to use macros or type declarations to
associate additional names, such as "short" or "single". These are