diff options
Diffstat (limited to 'contrib/perl5/pod/perlnumber.pod')
-rw-r--r-- | contrib/perl5/pod/perlnumber.pod | 185 |
1 files changed, 0 insertions, 185 deletions
diff --git a/contrib/perl5/pod/perlnumber.pod b/contrib/perl5/pod/perlnumber.pod deleted file mode 100644 index 44d921c..0000000 --- a/contrib/perl5/pod/perlnumber.pod +++ /dev/null @@ -1,185 +0,0 @@ -=head1 NAME - -perlnumber - semantics of numbers and numeric operations in Perl - -=head1 SYNOPSIS - - $n = 1234; # decimal integer - $n = 0b1110011; # binary integer - $n = 01234; # octal integer - $n = 0x1234; # hexadecimal integer - $n = 12.34e-56; # exponential notation - $n = "-12.34e56"; # number specified as a string - $n = "1234"; # number specified as a string - $n = v49.50.51.52; # number specified as a string, which in - # turn is specified in terms of numbers :-) - -=head1 DESCRIPTION - -This document describes how Perl internally handles numeric values. - -Perl's operator overloading facility is completely ignored here. Operator -overloading allows user-defined behaviors for numbers, such as operations -over arbitrarily large integers, floating points numbers with arbitrary -precision, operations over "exotic" numbers such as modular arithmetic or -p-adic arithmetic, and so on. See L<overload> for details. - -=head1 Storing numbers - -Perl can internally represent numbers in 3 different ways: as native -integers, as native floating point numbers, and as decimal strings. -Decimal strings may have an exponential notation part, as in C<"12.34e-56">. -I<Native> here means "a format supported by the C compiler which was used -to build perl". - -The term "native" does not mean quite as much when we talk about native -integers, as it does when native floating point numbers are involved. -The only implication of the term "native" on integers is that the limits for -the maximal and the minimal supported true integral quantities are close to -powers of 2. However, "native" floats have a most fundamental -restriction: they may represent only those numbers which have a relatively -"short" representation when converted to a binary fraction. For example, -0.9 cannot be represented by a native float, since the binary fraction -for 0.9 is infinite: - - binary0.1110011001100... - -with the sequence C<1100> repeating again and again. In addition to this -limitation, the exponent of the binary number is also restricted when it -is represented as a floating point number. On typical hardware, floating -point values can store numbers with up to 53 binary digits, and with binary -exponents between -1024 and 1024. In decimal representation this is close -to 16 decimal digits and decimal exponents in the range of -304..304. -The upshot of all this is that Perl cannot store a number like -12345678901234567 as a floating point number on such architectures without -loss of information. - -Similarly, decimal strings can represent only those numbers which have a -finite decimal expansion. Being strings, and thus of arbitrary length, there -is no practical limit for the exponent or number of decimal digits for these -numbers. (But realize that what we are discussing the rules for just the -I<storage> of these numbers. The fact that you can store such "large" numbers -does not mean that the I<operations> over these numbers will use all -of the significant digits. -See L<"Numeric operators and numeric conversions"> for details.) - -In fact numbers stored in the native integer format may be stored either -in the signed native form, or in the unsigned native form. Thus the limits -for Perl numbers stored as native integers would typically be -2**31..2**32-1, -with appropriate modifications in the case of 64-bit integers. Again, this -does not mean that Perl can do operations only over integers in this range: -it is possible to store many more integers in floating point format. - -Summing up, Perl numeric values can store only those numbers which have -a finite decimal expansion or a "short" binary expansion. - -=head1 Numeric operators and numeric conversions - -As mentioned earlier, Perl can store a number in any one of three formats, -but most operators typically understand only one of those formats. When -a numeric value is passed as an argument to such an operator, it will be -converted to the format understood by the operator. - -Six such conversions are possible: - - native integer --> native floating point (*) - native integer --> decimal string - native floating_point --> native integer (*) - native floating_point --> decimal string (*) - decimal string --> native integer - decimal string --> native floating point (*) - -These conversions are governed by the following general rules: - -=over 4 - -=item * - -If the source number can be represented in the target form, that -representation is used. - -=item * - -If the source number is outside of the limits representable in the target form, -a representation of the closest limit is used. (I<Loss of information>) - -=item * - -If the source number is between two numbers representable in the target form, -a representation of one of these numbers is used. (I<Loss of information>) - -=item * - -In C<< native floating point --> native integer >> conversions the magnitude -of the result is less than or equal to the magnitude of the source. -(I<"Rounding to zero".>) - -=item * - -If the C<< decimal string --> native integer >> conversion cannot be done -without loss of information, the result is compatible with the conversion -sequence C<< decimal_string --> native_floating_point --> native_integer >>. -In particular, rounding is strongly biased to 0, though a number like -C<"0.99999999999999999999"> has a chance of being rounded to 1. - -=back - -B<RESTRICTION>: The conversions marked with C<(*)> above involve steps -performed by the C compiler. In particular, bugs/features of the compiler -used may lead to breakage of some of the above rules. - -=head1 Flavors of Perl numeric operations - -Perl operations which take a numeric argument treat that argument in one -of four different ways: they may force it to one of the integer/floating/ -string formats, or they may behave differently depending on the format of -the operand. Forcing a numeric value to a particular format does not -change the number stored in the value. - -All the operators which need an argument in the integer format treat the -argument as in modular arithmetic, e.g., C<mod 2**32> on a 32-bit -architecture. C<sprintf "%u", -1> therefore provides the same result as -C<sprintf "%u", ~0>. - -=over 4 - -=item Arithmetic operators except, C<no integer> - -force the argument into the floating point format. - -=item Arithmetic operators except, C<use integer> - -=item Bitwise operators, C<no integer> - -force the argument into the integer format if it is not a string. - -=item Bitwise operators, C<use integer> - -force the argument into the integer format - -=item Operators which expect an integer - -force the argument into the integer format. This is applicable -to the third and fourth arguments of C<sysread>, for example. - -=item Operators which expect a string - -force the argument into the string format. For example, this is -applicable to C<printf "%s", $value>. - -=back - -Though forcing an argument into a particular form does not change the -stored number, Perl remembers the result of such conversions. In -particular, though the first such conversion may be time-consuming, -repeated operations will not need to redo the conversion. - -=head1 AUTHOR - -Ilya Zakharevich C<ilya@math.ohio-state.edu> - -Editorial adjustments by Gurusamy Sarathy <gsar@ActiveState.com> - -=head1 SEE ALSO - -L<overload> |