Fraction.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 22 Sep 2015 16:28:42 +0100
branchjv
changeset 18759 c1217211909c
parent 18261 22bdfc405bca
child 18858 2968df243134
permissions -rw-r--r--
Changed identification strings to contain jv-branch ...to make explicit that this distribution is not the official one used by eXept and therefore that eXept is not to be blamed in case of any problem.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1989 by Claus Gittinger
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
     3
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
a27a279701f8 Initial revision
claus
parents:
diff changeset
     5
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
"
5552
31b5cc144476 category changes
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    12
"{ Package: 'stx:libbasic' }"
31b5cc144476 category changes
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    13
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
Number subclass:#Fraction
5552
31b5cc144476 category changes
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    15
	instanceVariableNames:'numerator denominator'
6675
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
    16
	classVariableNames:'FractionOne FractionZero PrintWholeNumbers'
5552
31b5cc144476 category changes
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    17
	poolDictionaries:''
31b5cc144476 category changes
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    18
	category:'Magnitude-Numbers'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
    21
!Fraction class methodsFor:'documentation'!
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    22
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    23
copyright
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    24
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    25
 COPYRIGHT (c) 1989 by Claus Gittinger
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    26
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    27
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    28
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    29
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    30
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    31
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    32
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    33
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    34
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    35
!
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    36
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    37
documentation
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    38
"
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    39
    Instances of Fraction represent fractional numbers consisting of
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    40
    a numerator and denominator. Both are themselfes arbitrary precision
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    41
    integers.
6675
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
    42
    Fractions are usually created by dividing Integers using / (for exact division).
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
    43
    Notice, that all operations on fractions reduce their result; this means, that
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
    44
    the result of a fraction-operation may return an integer.
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
    45
    Aka:
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    46
	(1 / 7) * 7   ->  1  (not 0.99999999...)
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1264
diff changeset
    47
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
    48
    Mixed mode arithmetic:
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    49
	fraction op fraction    -> fraction/integer
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    50
	fraction op fix         -> fix; scale is fix's scale
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    51
	fraction op integer     -> fraction/integer
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    52
	fraction op float       -> float
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
    53
6675
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
    54
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
    55
    [classVariables:]
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    56
	PrintWholeNumbers       Booolean        experimental:
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    57
						controls how fractions which are greater than 1 are printed.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    58
						if true, print them as a sum of an integral and the fractional part.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    59
						(Large ones are easier to read this way)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    60
						     (17/3) printString  -> '(5+(2/3))'
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    61
						for now, the default is false, for backward compatibility
6675
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
    62
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1264
diff changeset
    63
    [author:]
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    64
	Claus Gittinger
1556
134d96466f5a commentary
Claus Gittinger <cg@exept.de>
parents: 1555
diff changeset
    65
134d96466f5a commentary
Claus Gittinger <cg@exept.de>
parents: 1555
diff changeset
    66
    [see also:]
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    67
	Number
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    68
	FixedPoint Float ShortFloat LongFloat Integer Complex
1295
83f594f05c52 documentation
Claus Gittinger <cg@exept.de>
parents: 1264
diff changeset
    69
"
88
81dacba7a63a *** empty log message ***
claus
parents: 77
diff changeset
    70
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
    72
!Fraction class methodsFor:'instance creation'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    73
a27a279701f8 Initial revision
claus
parents:
diff changeset
    74
new
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
    "create and return a new fraction with value 0"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    76
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
    77
    ^ self numerator:0 denominator:1
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    78
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    79
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
numerator:num denominator:den
8629
07ece572135f care for zeroDivide
penk
parents: 8395
diff changeset
    81
    "create and return a new fraction with numerator num and denominator den.
07ece572135f care for zeroDivide
penk
parents: 8395
diff changeset
    82
     Notice: stc inlines this message if sent to the global named Fraction."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
    84
    |newFraction|
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
    85
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
%{  /* NOCONTEXT */
18240
28af09029a8b ifdef for SCHTEAM engine changed (not relevant for ST/X)
Claus Gittinger <cg@exept.de>
parents: 18239
diff changeset
    87
#ifdef __SCHTEAM__
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    88
    if (self == Fraction.Class) {
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    89
	return context._RETURN(new STFraction(num, den));
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    90
    }
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    91
#else
13
62303f84ff5f *** empty log message ***
claus
parents: 5
diff changeset
    92
    /* this check allows subclassing .. */
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
    if (self == Fraction) {
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    94
	if (__bothSmallInteger(num, den)) {
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    95
	    if (den != __mkSmallInteger(0)) {
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    96
		if (__CanDoQuickAlignedNew(sizeof(struct __Fraction))) {    /* OBJECT ALLOCATION */
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    97
		    OBJ newFraction;
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    98
		    int spc;
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
    99
		    INT iDen;
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   100
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   101
		    __qCheckedAlignedNew(newFraction, sizeof(struct __Fraction));
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   102
		    __InstPtr(newFraction)->o_class = self;
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   103
		    __qSTORE(newFraction, self);
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   104
		    iDen = __intVal(den);
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   105
		    if (iDen != 0) {
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   106
			if (iDen < 0) {
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   107
			    __FractionInstPtr(newFraction)->f_numerator = __mkSmallInteger(- __intVal(num));
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   108
			    __FractionInstPtr(newFraction)->f_denominator = __mkSmallInteger(- iDen);
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   109
			} else {
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   110
			    __FractionInstPtr(newFraction)->f_numerator = num;
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   111
			    __FractionInstPtr(newFraction)->f_denominator = den;
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   112
			}
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   113
			if (num == __mkSmallInteger(1)) {
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   114
			    /* no need to reduce */
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   115
			    RETURN ( newFraction );
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   116
			}
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   117
		    }
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   118
		}
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   119
	    }
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   120
	}
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   121
    }
18240
28af09029a8b ifdef for SCHTEAM engine changed (not relevant for ST/X)
Claus Gittinger <cg@exept.de>
parents: 18239
diff changeset
   122
#endif /* not __SCHTEAM__ */
2790
495b8ea6a4cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2789
diff changeset
   123
%}.
8629
07ece572135f care for zeroDivide
penk
parents: 8395
diff changeset
   124
    den = 0 ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   125
	^ ZeroDivide raiseRequestWith:thisContext.
7140
f65ec31fc081 oops - noone cared for generating fractions with 0 denominator
Claus Gittinger <cg@exept.de>
parents: 7139
diff changeset
   126
    ].
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   127
    newFraction isNil ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   128
	newFraction := self basicNew setNumerator:num denominator:den.
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   129
    ].
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   130
    ^ newFraction reduced
7140
f65ec31fc081 oops - noone cared for generating fractions with 0 denominator
Claus Gittinger <cg@exept.de>
parents: 7139
diff changeset
   131
f65ec31fc081 oops - noone cared for generating fractions with 0 denominator
Claus Gittinger <cg@exept.de>
parents: 7139
diff changeset
   132
    "
f65ec31fc081 oops - noone cared for generating fractions with 0 denominator
Claus Gittinger <cg@exept.de>
parents: 7139
diff changeset
   133
     Fraction numerator:1 denominator:3
f65ec31fc081 oops - noone cared for generating fractions with 0 denominator
Claus Gittinger <cg@exept.de>
parents: 7139
diff changeset
   134
     Fraction numerator:2 denominator:6
f65ec31fc081 oops - noone cared for generating fractions with 0 denominator
Claus Gittinger <cg@exept.de>
parents: 7139
diff changeset
   135
f65ec31fc081 oops - noone cared for generating fractions with 0 denominator
Claus Gittinger <cg@exept.de>
parents: 7139
diff changeset
   136
     Fraction numerator:1 denominator:0
f65ec31fc081 oops - noone cared for generating fractions with 0 denominator
Claus Gittinger <cg@exept.de>
parents: 7139
diff changeset
   137
     Fraction numerator:2 denominator:0
f65ec31fc081 oops - noone cared for generating fractions with 0 denominator
Claus Gittinger <cg@exept.de>
parents: 7139
diff changeset
   138
    "
11899
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   139
!
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   140
16938
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   141
readDecimalFractionFrom:aStringOrStream onError:exceptionBlock
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   142
    "Read an arbitrary number (>0) of digits representing a decimal fraction."
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   143
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   144
    |anyDigit factor fraction s ch|
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   145
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   146
    s := aStringOrStream isStream ifTrue:[aStringOrStream] ifFalse:[aStringOrStream readStream].
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   147
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   148
    factor := (1 / 10).
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   149
    fraction := 0.
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   150
    anyDigit := false.
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   151
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   152
    [
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   153
	ch := s peekOrNil.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   154
	ch notNil and:[ch isDigit].
16938
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   155
    ] whileTrue: [
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   156
	s next.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   157
	anyDigit := true.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   158
	fraction := (ch digitValue) * factor + fraction.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   159
	factor := (factor / 10).
16938
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   160
    ].
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   161
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   162
    anyDigit ifFalse: [^ exceptionBlock valueWithOptionalArgument: 'Missing digits in fraction'].
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   163
    ^ fraction
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   164
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   165
    "
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   166
     Fraction readDecimalFractionFrom:'1'   onError:[nil]     -> 0.1
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   167
     Fraction readDecimalFractionFrom:'123' onError:[nil]     -> 0.123
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   168
     Fraction readDecimalFractionFrom:'5'   onError:[nil]     -> 0.5
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   169
     Fraction readDecimalFractionFrom:'005' onError:[nil]     -> 0.005
16938
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   170
     Fraction readDecimalFractionFrom:''    onError:[nil]     -> nil
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   171
     Fraction readDecimalFractionFrom:'aa'  onError:[nil]     -> nil
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   172
    "
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   173
!
ffe3202e45bd class: Fraction
Claus Gittinger <cg@exept.de>
parents: 16729
diff changeset
   174
11899
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   175
readFrom:aStringOrStream onError:exceptionBlock
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   176
    |s numerator denominator|
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   177
11901
285349acebd8 readFrom
Claus Gittinger <cg@exept.de>
parents: 11899
diff changeset
   178
    "/ sigh - care for subclasses...
285349acebd8 readFrom
Claus Gittinger <cg@exept.de>
parents: 11899
diff changeset
   179
    self == Fraction ifFalse:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   180
	^ super readFrom:aStringOrStream onError:exceptionBlock
11901
285349acebd8 readFrom
Claus Gittinger <cg@exept.de>
parents: 11899
diff changeset
   181
    ].
285349acebd8 readFrom
Claus Gittinger <cg@exept.de>
parents: 11899
diff changeset
   182
11899
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   183
    s := aStringOrStream readStream.
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   184
    s skipSeparators.
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   185
    s peek == $( ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   186
	s next.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   187
11899
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   188
    ].
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   189
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   190
    numerator := super readFrom:s onError:[^ exceptionBlock value].
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   191
    numerator isInteger ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   192
	s skipSeparators.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   193
	(s peek == $/) ifTrue:[
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   194
	    s next.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   195
	    denominator := Integer readFrom:s onError:[^ exceptionBlock value].
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   196
	    ^ self numerator:numerator denominator:denominator
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   197
	].
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   198
	^ numerator
11899
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   199
    ].
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   200
    ^ numerator asFraction
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   201
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   202
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   203
     Fraction readFrom:'1'
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   204
     Fraction readFrom:'2'
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   205
     Fraction readFrom:'1.5'
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   206
     Fraction readFrom:'1/5'
11899
ad777208fdb5 added fraction-readFrom
Claus Gittinger <cg@exept.de>
parents: 11734
diff changeset
   207
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   209
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   210
!Fraction class methodsFor:'class initialization'!
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   211
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   212
initialize
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   213
    FractionZero isNil ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   214
	FractionZero := self numerator:0 denominator:1.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   215
	FractionOne := self numerator:1 denominator:1
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   216
    ]
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   217
! !
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   218
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   219
!Fraction class methodsFor:'constants'!
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   220
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   221
pi
11671
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   222
    "return an approximation of the constant pi as Fraction.
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   223
     The approx. returned here has an error smaller than representable by float instances"
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   224
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   225
    ^ self
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   226
	numerator:314159265358979323846264343
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   227
	denominator:100000000000000000000000000
6063
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
   228
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   229
"/    ^ self
6063
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
   230
"/        numerator:  314159265358979323846264338327950288419716939937510582097494459
Claus Gittinger <cg@exept.de>
parents: 5552
diff changeset
   231
"/        denominator:100000000000000000000000000000000000000000000000000000000000000
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   232
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   233
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   234
     Fraction pi
13357
487c502b40b7 comment/format in: #pi
Claus Gittinger <cg@exept.de>
parents: 11901
diff changeset
   235
     Fraction pi asFloat - Float pi
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   236
     Float pi
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   237
    "
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   238
13357
487c502b40b7 comment/format in: #pi
Claus Gittinger <cg@exept.de>
parents: 11901
diff changeset
   239
    "Modified: / 03-05-2011 / 11:08:46 / cg"
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   240
!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   241
11671
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   242
pi_approximation
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   243
    "return an approximation of the constant pi as Fraction.
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   244
     The approx. returned is good for 6 valid digits and has an error of less than -2.67-07.
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   245
     The value might be useful to avoid floating point numbers in graphic rendering code,
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   246
     where 6 digits of precision are usually good enough."
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   247
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   248
    ^ self
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   249
	numerator:355
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   250
	denominator:113
11671
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   251
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   252
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   253
     Fraction pi
11671
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   254
     Fraction pi asFloat
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   255
     Float pi - Fraction pi_approximation asFloat
11671
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   256
    "
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   257
!
6901343001b6 approx pi
Claus Gittinger <cg@exept.de>
parents: 11250
diff changeset
   258
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   259
unity
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   260
    "return the neutral element for multiplication (1 / 1)"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   261
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   262
    ^ FractionOne
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   263
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   264
    "Modified: 18.7.1996 / 12:26:06 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   265
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   266
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   267
zero
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   268
    "return the neutral element for addition (0 / 1)"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   269
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   270
    ^ FractionZero
1555
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   271
316491c1b216 commentary
Claus Gittinger <cg@exept.de>
parents: 1295
diff changeset
   272
    "Modified: 18.7.1996 / 12:26:12 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   273
! !
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   274
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   275
!Fraction class methodsFor:'queries'!
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   276
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   277
isBuiltInClass
1264
8d916aa63bce commentary
Claus Gittinger <cg@exept.de>
parents: 1200
diff changeset
   278
    "return true if this class is known by the run-time-system.
8d916aa63bce commentary
Claus Gittinger <cg@exept.de>
parents: 1200
diff changeset
   279
     Here, true is returned for myself, false for subclasses."
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   280
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   281
    ^ self == Fraction
1264
8d916aa63bce commentary
Claus Gittinger <cg@exept.de>
parents: 1200
diff changeset
   282
8d916aa63bce commentary
Claus Gittinger <cg@exept.de>
parents: 1200
diff changeset
   283
    "Modified: 23.4.1996 / 15:59:10 / cg"
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   284
! !
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   285
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   286
!Fraction methodsFor:'accessing'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   287
a27a279701f8 Initial revision
claus
parents:
diff changeset
   288
denominator
a27a279701f8 Initial revision
claus
parents:
diff changeset
   289
    "return the denominator"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   290
a27a279701f8 Initial revision
claus
parents:
diff changeset
   291
    ^ denominator
a27a279701f8 Initial revision
claus
parents:
diff changeset
   292
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   293
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   294
numerator
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   295
    "return the numerator"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   296
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   297
    ^ numerator
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   298
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
!Fraction methodsFor:'arithmetic'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   302
* aNumber
11734
7c2cc71aabc9 comment
Claus Gittinger <cg@exept.de>
parents: 11722
diff changeset
   303
    "return the product of the receiver and the argument."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   304
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   305
    "/ notice:
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   306
    "/ the following code handles some common cases,
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   307
    "/ and exists as an optimization, to speed up those cases.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   308
    "/ also notice, that checks for those cases must be inlinable without
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   309
    "/ a message send; otherwise double-dispatch is just as fast.
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   310
    "/
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   311
    "/ Conceptionally, (and for most other argument types),
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   312
    "/ mixed arithmetic is implemented by double dispatching
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   313
    "/ (see the message send at the bottom)
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   314
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   315
    (aNumber isMemberOf:SmallInteger) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   316
	^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   317
		numerator:(numerator * aNumber)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   318
		denominator:denominator
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   319
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   320
    (aNumber isMemberOf:Float) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   321
	^ (numerator * aNumber) / denominator
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   322
    ].
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   323
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   324
    ^ aNumber productFromFraction:self
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   325
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   326
    "Modified: 28.7.1997 / 19:09:23 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   327
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   328
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   329
+ aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   330
    "return the sum of the receiver and the argument, aNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   331
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   332
    "/ notice:
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   333
    "/ the following code handles some common cases,
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   334
    "/ and exists as an optimization, to speed up those cases.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   335
    "/ also notice, that checks for those cases must be inlinable without
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   336
    "/ a message send; otherwise double-dispatch is just as fast.
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   337
    "/
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   338
    "/ Conceptionally, (and for most other argument types),
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   339
    "/ mixed arithmetic is implemented by double dispatching
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   340
    "/ (see the message send at the bottom)
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   341
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   342
    (aNumber isMemberOf:SmallInteger) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   343
	^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   344
	    numerator:(numerator + (denominator * aNumber))
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   345
	    denominator:denominator
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   346
    ].
16
a580032d04f6 *** empty log message ***
claus
parents: 13
diff changeset
   347
    (aNumber isMemberOf:Float) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   348
	^ (numerator asFloat / denominator asFloat) + aNumber
16
a580032d04f6 *** empty log message ***
claus
parents: 13
diff changeset
   349
    ].
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   350
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   351
    ^ aNumber sumFromFraction:self
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   352
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   353
    "Modified: 28.7.1997 / 19:09:16 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   354
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   355
a27a279701f8 Initial revision
claus
parents:
diff changeset
   356
- aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   357
    "return the difference of the receiver and the argument, aNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   358
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   359
    "/ notice:
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   360
    "/ the following code handles some common cases,
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   361
    "/ and exists as an optimization, to speed up those cases.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   362
    "/ also notice, that checks for those cases must be inlinable without
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   363
    "/ a message send; otherwise double-dispatch is just as fast.
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   364
    "/
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   365
    "/ Conceptionally, (and for most other argument types),
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   366
    "/ mixed arithmetic is implemented by double dispatching
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   367
    "/ (see the message send at the bottom)
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   368
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   369
    (aNumber isMemberOf:SmallInteger) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   370
	^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   371
		numerator:(numerator - (denominator * aNumber))
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   372
		denominator:denominator
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   373
    ].
16
a580032d04f6 *** empty log message ***
claus
parents: 13
diff changeset
   374
    (aNumber isMemberOf:Float) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   375
	^ (numerator asFloat / denominator asFloat) - aNumber
16
a580032d04f6 *** empty log message ***
claus
parents: 13
diff changeset
   376
    ].
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   377
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   378
    ^ aNumber differenceFromFraction:self
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   379
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   380
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   381
     (1/3) - (1/9)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   382
     (1/9) - (1/3)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   383
     (999/1000) - (1/1000)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   384
     (999/1000) - (1/1000000)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   385
     (999000/1000000) - (1/1000000)
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   386
    "
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   387
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   388
    "Modified: 28.7.1997 / 19:09:11 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   389
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   390
a27a279701f8 Initial revision
claus
parents:
diff changeset
   391
/ aNumber
a27a279701f8 Initial revision
claus
parents:
diff changeset
   392
    "return the quotient of the receiver and the argument, aNumber"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   393
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   394
    "/ notice:
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   395
    "/ the following code handles some common cases,
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   396
    "/ and exists as an optimization, to speed up those cases.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   397
    "/ also notice, that checks for those cases must be inlinable without
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   398
    "/ a message send; otherwise double-dispatch is just as fast.
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   399
    "/
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   400
    "/ Conceptionally, (and for most other argument types),
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   401
    "/ mixed arithmetic is implemented by double dispatching
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   402
    "/ (see the message send at the bottom)
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   403
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   404
    (aNumber isMemberOf:SmallInteger) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   405
	^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   406
		numerator:numerator
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   407
		denominator:(denominator * aNumber)
16
a580032d04f6 *** empty log message ***
claus
parents: 13
diff changeset
   408
    ].
a580032d04f6 *** empty log message ***
claus
parents: 13
diff changeset
   409
    (aNumber isMemberOf:Float) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   410
	^ numerator / (denominator * aNumber)
16
a580032d04f6 *** empty log message ***
claus
parents: 13
diff changeset
   411
    ].
6064
04bde2eeb749 comments about double dispatching
Claus Gittinger <cg@exept.de>
parents: 6063
diff changeset
   412
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
    ^ aNumber quotientFromFraction:self
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   414
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   415
    "Modified: 28.7.1997 / 19:09:06 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   416
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   417
a27a279701f8 Initial revision
claus
parents:
diff changeset
   418
// aNumber
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   419
    "return the integer quotient of dividing the receiver by aNumber with
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   420
     truncation towards negative infinity."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   421
a27a279701f8 Initial revision
claus
parents:
diff changeset
   422
    ^ (numerator * aNumber denominator) // (denominator * aNumber numerator)
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   423
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   424
    "
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   425
     0.5 // 1
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   426
     -0.5 // 1
3984
45a76e2f4236 Fix so that // and \\ truncate towards negative infinity and
Stefan Vogel <sv@exept.de>
parents: 3899
diff changeset
   427
     (1/2) // 1  = 0 ifFalse:[self halt].
45a76e2f4236 Fix so that // and \\ truncate towards negative infinity and
Stefan Vogel <sv@exept.de>
parents: 3899
diff changeset
   428
     (-1/2) // 1 = -1 ifFalse:[self halt].
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   429
    "
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   430
3984
45a76e2f4236 Fix so that // and \\ truncate towards negative infinity and
Stefan Vogel <sv@exept.de>
parents: 3899
diff changeset
   431
    "Modified: / 5.11.1996 / 11:47:14 / cg"
45a76e2f4236 Fix so that // and \\ truncate towards negative infinity and
Stefan Vogel <sv@exept.de>
parents: 3899
diff changeset
   432
    "Modified: / 13.2.1998 / 09:15:35 / stefan"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   433
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   434
a27a279701f8 Initial revision
claus
parents:
diff changeset
   435
negated
a27a279701f8 Initial revision
claus
parents:
diff changeset
   436
    "optional - could use inherited method ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   437
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   438
    ^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   439
	numerator:(numerator negated)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   440
	denominator:denominator
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   441
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   442
    "Modified: 5.11.1996 / 10:29:11 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   443
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   444
a27a279701f8 Initial revision
claus
parents:
diff changeset
   445
reciprocal
a27a279701f8 Initial revision
claus
parents:
diff changeset
   446
    "optional - could use inherited method ..."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   447
a27a279701f8 Initial revision
claus
parents:
diff changeset
   448
    numerator == 1 ifTrue:[^ denominator].
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   449
    ^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   450
	numerator:denominator
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   451
	denominator:numerator
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   452
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   453
    "Modified: 5.11.1996 / 10:29:22 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   454
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   455
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   456
!Fraction methodsFor:'coercing & converting'!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   457
1892
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   458
asFixedPoint
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   459
    "return the receiver as fixedPoint number.
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   460
     Q: what should the scale be here ?"
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   461
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   462
    ^ FixedPoint numerator:numerator denominator:denominator scale:2
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   463
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   464
    "
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   465
     (1/2) asFixedPoint
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   466
    "
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   467
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   468
    "Created: 5.11.1996 / 15:15:54 / cg"
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   469
!
d3564145c15c *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 1878
diff changeset
   470
2140
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   471
asFixedPoint:scale
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   472
    "return the receiver as fixedPoint number, with the given number
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   473
     of post-decimal-point digits."
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   474
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   475
    ^ FixedPoint numerator:numerator denominator:denominator scale:scale
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   476
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   477
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   478
     (1/2) asFixedPoint:2
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   479
     (1/3) asFixedPoint:2
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   480
     (1/3) asFixedPoint:5
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   481
     (2/3) asFixedPoint:2
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   482
     (2/3) asFixedPoint:5
2140
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   483
    "
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   484
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   485
    "Created: 5.11.1996 / 15:15:54 / cg"
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   486
    "Modified: 10.1.1997 / 19:54:50 / cg"
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   487
!
5e2def558185 added #asFixedPoint:
Claus Gittinger <cg@exept.de>
parents: 1893
diff changeset
   488
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   489
asFloat
11239
951d0e92ab3d comment
Claus Gittinger <cg@exept.de>
parents: 10486
diff changeset
   490
    "return a float with (approximately) my value.
951d0e92ab3d comment
Claus Gittinger <cg@exept.de>
parents: 10486
diff changeset
   491
     Since floats have a limited precision, you usually loose bits when doing this."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   492
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   493
    |num den numShift denShift bits rslt|
6571
101905a14870 Fix #asFloat for non-trivial Fractions
Stefan Vogel <sv@exept.de>
parents: 6486
diff changeset
   494
101905a14870 Fix #asFloat for non-trivial Fractions
Stefan Vogel <sv@exept.de>
parents: 6486
diff changeset
   495
    (numerator class == SmallInteger and:[denominator class == SmallInteger]) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   496
	^ (numerator asFloat) / (denominator asFloat)
6571
101905a14870 Fix #asFloat for non-trivial Fractions
Stefan Vogel <sv@exept.de>
parents: 6486
diff changeset
   497
    ].
101905a14870 Fix #asFloat for non-trivial Fractions
Stefan Vogel <sv@exept.de>
parents: 6486
diff changeset
   498
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   499
    "Do it the hard way: reduce magnitude and undo reduction on the quotient"
6571
101905a14870 Fix #asFloat for non-trivial Fractions
Stefan Vogel <sv@exept.de>
parents: 6486
diff changeset
   500
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   501
    bits := Float precision * 2.    "number of bits to preserve (conservative)"
6571
101905a14870 Fix #asFloat for non-trivial Fractions
Stefan Vogel <sv@exept.de>
parents: 6486
diff changeset
   502
    num := numerator abs.
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   503
    numShift := bits - num highBit. "(num highBit - bits) negated"
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   504
    numShift < 0 ifTrue:[num := num bitShift:numShift] ifFalse:[numShift := 0].
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   505
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   506
    den :=  denominator.
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   507
    denShift := bits - den highBit. "(den highBit - bits) negated"
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   508
    denShift < 0 ifTrue:[den := den bitShift:denShift] ifFalse:[denShift := 0].
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   509
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   510
    rslt := (num asFloat / den asFloat) * (2 raisedToInteger:denShift-numShift).
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   511
    numerator negative ifTrue:[ ^ rslt negated ].
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   512
    ^ rslt.
6571
101905a14870 Fix #asFloat for non-trivial Fractions
Stefan Vogel <sv@exept.de>
parents: 6486
diff changeset
   513
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   514
    "
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   515
      (5/9) asFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   516
      (-5/9) asFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   517
      (500000000000/900000000000) asFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   518
      (-500000000000/900000000000) asFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   519
      (500000000000/9) asFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   520
      (5/900000000000) asFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   521
      89012345678901234567 asFloat / 123456789123456789 asFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   522
      (89012345678901234567 / 123456789123456789) asFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   523
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   524
      (
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   525
       180338700661043257034670206806167960222709397862806840937993331366591676308781197477183367018067356365812757479444845320188679437752013593674158587947149815441890236037219685250845721864713487208757788709113534916165172927384095182655935222723385253851776639985379367854545495930551624041981995105743408203125
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   526
	/
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   527
       180331613628627651967947866455016278082980736719853750685591387625058011528928110602436691256100991596843001549483950600930062886280582766771424470965440873615557144641435276844465734361353086032476712374317224249252177316815544331763696909434844464464323192083930469387098582956241443753242492675781250
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   528
      ) asFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   529
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   530
      180338700661043257034670206806167960222709397862806840937993331366591676308781197477183367018067356365812757479444845320188679437752013593674158587947149815441890236037219685250845721864713487208757788709113534916165172927384095182655935222723385253851776639985379367854545495930551624041981995105743408203125
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   531
	 asFloat /
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   532
      180331613628627651967947866455016278082980736719853750685591387625058011528928110602436691256100991596843001549483950600930062886280582766771424470965440873615557144641435276844465734361353086032476712374317224249252177316815544331763696909434844464464323192083930469387098582956241443753242492675781250
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   533
	 asFloat
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   534
    "
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   535
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   536
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   537
asFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   538
    "return the receiver as fraction - thats itself"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   539
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   540
    ^ self
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   541
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   542
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   543
asInteger
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   544
    "return an integer with my value - will usually truncate"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   545
a27a279701f8 Initial revision
claus
parents:
diff changeset
   546
    ^ numerator // denominator
a27a279701f8 Initial revision
claus
parents:
diff changeset
   547
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   548
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   549
asLargeFloat
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   550
    "return a large float with (approximately) my value"
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   551
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   552
    ^ (numerator asLargeFloat) / (denominator asLargeFloat)
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   553
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   554
    "
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   555
      (5/9) asLargeFloat
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   556
      (500000000000/900000000000) asLargeFloat
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   557
      (500000000000/9) asLargeFloat
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   558
    "
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   559
!
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   560
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   561
asLargeInteger
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   562
    "return an integer with my value - will usually truncate"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   563
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   564
    ^ self asInteger asLargeInteger
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   565
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   566
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   567
asLongFloat
15278
ddf05cd996da class: Fraction
Claus Gittinger <cg@exept.de>
parents: 13357
diff changeset
   568
    "return a long float with (approximately) my value.
ddf05cd996da class: Fraction
Claus Gittinger <cg@exept.de>
parents: 13357
diff changeset
   569
     Since floats have a limited precision, you usually loose bits when doing this."
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   570
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   571
    |num den numShift denShift numBits rslt|
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   572
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   573
    (numerator class == SmallInteger and:[denominator class == SmallInteger]) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   574
	^ (numerator asLongFloat) / (denominator asLongFloat)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   575
    ].
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   576
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   577
    "Do it the hard way: reduce magnitude and undo reduction on the quotient"
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   578
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   579
    numBits := LongFloat precision * 2.    "number of bits to preserve (conservative)"
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   580
    num := numerator abs.
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   581
    numShift := numBits - num highBit. "(num highBit - bits) negated"
15278
ddf05cd996da class: Fraction
Claus Gittinger <cg@exept.de>
parents: 13357
diff changeset
   582
    numShift < 0 ifTrue:[num := num bitShift:numShift] ifFalse:[ numShift := 0].
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   583
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   584
    den :=  denominator.
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   585
    denShift := numBits - den highBit. "(den highBit - bits) negated"
15278
ddf05cd996da class: Fraction
Claus Gittinger <cg@exept.de>
parents: 13357
diff changeset
   586
    denShift < 0 ifTrue:[den := den bitShift:denShift] ifFalse:[denShift := 0].
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   587
7730
dda82553acc7 make #asLongFloat return a LongFloat (returned Float)
Stefan Vogel <sv@exept.de>
parents: 7571
diff changeset
   588
    rslt := (num asLongFloat / den asLongFloat) * (2 raisedToInteger:denShift-numShift).
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   589
    numerator negative ifTrue:[ ^ rslt negated ].
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   590
    ^ rslt.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   591
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   592
    "
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   593
      (5/9) asLongFloat
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   594
      (-5/9) asLongFloat
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   595
      (Fraction basicNew setNumerator:500000000000 denominator:900000000000) asLongFloat = (5/9) asLongFloat
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   596
      (Fraction basicNew setNumerator:500000000001 denominator:900000000000) asLongFloat = (5/9) asLongFloat
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   597
      (500000000001/900000000000) asLongFloat
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   598
      (-500000000001/900000000000) asLongFloat
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   599
      (500000000001/900000000000) asLongFloat = (5/9) asLongFloat
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   600
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   601
      (500000000000/9) asLongFloat
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   602
      (5/900000000000) asLongFloat
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   603
      89012345678901234567 asFloat / 123456789123456789 asLongFloat
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   604
      (89012345678901234567 / 123456789123456789) asLongFloat
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   605
      (-89012345678901234567 / 123456789123456789) asLongFloat
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   606
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   607
      (
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   608
       180338700661043257034670206806167960222709397862806840937993331366591676308781197477183367018067356365812757479444845320188679437752013593674158587947149815441890236037219685250845721864713487208757788709113534916165172927384095182655935222723385253851776639985379367854545495930551624041981995105743408203125
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   609
	/
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   610
       180331613628627651967947866455016278082980736719853750685591387625058011528928110602436691256100991596843001549483950600930062886280582766771424470965440873615557144641435276844465734361353086032476712374317224249252177316815544331763696909434844464464323192083930469387098582956241443753242492675781250
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   611
      ) asLongFloat
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   612
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   613
      180338700661043257034670206806167960222709397862806840937993331366591676308781197477183367018067356365812757479444845320188679437752013593674158587947149815441890236037219685250845721864713487208757788709113534916165172927384095182655935222723385253851776639985379367854545495930551624041981995105743408203125
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   614
	 asLongFloat /
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   615
      180331613628627651967947866455016278082980736719853750685591387625058011528928110602436691256100991596843001549483950600930062886280582766771424470965440873615557144641435276844465734361353086032476712374317224249252177316815544331763696909434844464464323192083930469387098582956241443753242492675781250
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   616
	 asLongFloat
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   617
    "
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   618
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   619
1200
cc16f7a00b52 limited shortFloat support
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   620
asShortFloat
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   621
    "return a short float with (approximately) my value"
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   622
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   623
    (numerator class == SmallInteger and:[denominator class == SmallInteger]) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   624
	^ (numerator asShortFloat) / (denominator asShortFloat)
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   625
    ].
1200
cc16f7a00b52 limited shortFloat support
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   626
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   627
    ^ self asFloat asShortFloat
1200
cc16f7a00b52 limited shortFloat support
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   628
6576
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   629
    "
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   630
      (5/9) asShortFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   631
      (500000000000/900000000000) asShortFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   632
      (500000000000/9) asShortFloat
c28cdeb0bfb0 Fix asFloat
Stefan Vogel <sv@exept.de>
parents: 6571
diff changeset
   633
    "
1200
cc16f7a00b52 limited shortFloat support
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   634
!
cc16f7a00b52 limited shortFloat support
Claus Gittinger <cg@exept.de>
parents: 1133
diff changeset
   635
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   636
coerce:aNumber
11722
d32d16dd6384 comment
Claus Gittinger <cg@exept.de>
parents: 11671
diff changeset
   637
    "convert the argument aNumber into an instance of the receivers class and return it."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   638
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   639
    ^ aNumber asFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   640
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   641
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   642
generality
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   643
    "return the generality value - see ArithmeticValue>>retry:coercing:"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   644
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   645
    ^ 60
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   646
! !
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   647
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   648
!Fraction methodsFor:'comparing'!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   649
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   650
< aNumber
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   651
    "return true if the receiver is less
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   652
     than aNumber, false otherwise."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   653
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   654
    (aNumber isMemberOf:SmallInteger) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   655
	^ numerator < (denominator * aNumber)
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   656
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   657
    ^ aNumber lessFromFraction:self
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   658
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   659
    "Modified: 5.11.1996 / 10:30:52 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   660
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   661
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   662
= aNumber
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   663
    "return true, if the argument represents the same numeric value
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   664
     as the receiver, false otherwise"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   665
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   666
    (aNumber isMemberOf:SmallInteger) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   667
	(denominator == 1) ifFalse:[
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   668
	    ^ numerator = (aNumber * denominator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   669
	].
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   670
	^ numerator = aNumber
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   671
    ].
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   672
    ^ aNumber equalFromFraction:self
3631
26a44b284912 handle largeInteger case in Fraction =
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
   673
26a44b284912 handle largeInteger case in Fraction =
Claus Gittinger <cg@exept.de>
parents: 2894
diff changeset
   674
    "Modified: / 7.7.1998 / 17:17:07 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   675
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   676
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   677
> aNumber
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   678
    "return true if the receiver is greater
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   679
     than aNumber, false otherwise."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   680
    "optional - could use inherited method ..."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   681
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   682
    (aNumber isMemberOf:SmallInteger) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   683
	^ numerator > (denominator * aNumber)
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   684
    ].
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   685
    ^ aNumber < self
4593
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   686
!
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   687
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   688
hash
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   689
    "return a number for hashing; redefined, since fractions compare
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   690
     by numeric value (i.e. (9/3) = 3), therefore (9/3) hash must be the same
4594
eb09f567a3bc float, shortFloat and fraction all hash alike
Claus Gittinger <cg@exept.de>
parents: 4593
diff changeset
   691
     as 3 hash."
4593
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   692
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   693
    (denominator = 1) ifTrue:[^ numerator hash].
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   694
4594
eb09f567a3bc float, shortFloat and fraction all hash alike
Claus Gittinger <cg@exept.de>
parents: 4593
diff changeset
   695
    ^ self asFloat hash
4593
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   696
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   697
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   698
     3 hash
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   699
     (9/3) hash
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   700
     3.0 hash
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   701
     (1/2) hash
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   702
     (1/4) hash
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   703
     0.0 hash
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   704
     0.5 hash
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   705
     0.25 hash
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   706
     0.4 hash
4593
1023fa0c779e *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 3984
diff changeset
   707
    "
5364
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   708
!
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   709
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   710
sameFractionValueAs:aNumber
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   711
    "return true, if the argument represents the same numeric value
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   712
     as the receiver, false otherwise"
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   713
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   714
    |rSelf rNum|
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   715
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   716
    rSelf := self reduced.
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   717
    rNum := aNumber reduced.
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   718
    rSelf denominator = rNum denominator ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   719
	^ rSelf numerator = rNum numerator
5364
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   720
    ].
a27f5167822c *** empty log message ***
ps
parents: 5322
diff changeset
   721
    ^ false
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   722
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
a27a279701f8 Initial revision
claus
parents:
diff changeset
   724
!Fraction methodsFor:'double dispatching'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   725
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   726
differenceFromFixedPoint:aFixedPoint
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   727
    |n d otherDenominator otherNumerator|
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   728
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   729
    otherDenominator := aFixedPoint denominator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   730
    otherNumerator := aFixedPoint numerator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   731
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   732
    "save a multiplication if possible"
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   733
    otherDenominator == denominator ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   734
	n := otherNumerator - numerator.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   735
	d := otherDenominator.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   736
    ] ifFalse:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   737
	n := (otherNumerator * denominator) - (numerator * otherDenominator).
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   738
	d := otherDenominator * denominator.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   739
    ].
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   740
    ^ aFixedPoint class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   741
	numerator:n
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   742
	denominator:d
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   743
	scale:(aFixedPoint scale)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   744
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   745
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   746
     ((1/3) asFixedPoint:2) - (1/3)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   747
     ((1/3) asFixedPoint:2) - (2/3)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   748
    "
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   749
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   750
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   751
differenceFromFloat:aFloat
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   752
    "sent when a float does not know how to subtract the receiver, a fraction"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   753
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   754
    ^ (aFloat * denominator - numerator) / denominator
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   755
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   756
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   757
differenceFromFraction:aFraction
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   758
    |n d otherDenominator otherNumerator|
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   759
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   760
    otherDenominator := aFraction denominator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   761
    otherNumerator := aFraction numerator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   762
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   763
    "save a multiplication if possible"
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   764
    otherDenominator == denominator ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   765
	n := otherNumerator - numerator.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   766
	d := otherDenominator.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   767
    ] ifFalse:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   768
	n := (otherNumerator * denominator) - (numerator * otherDenominator).
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   769
	d := otherDenominator * denominator.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   770
    ].
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   771
    ^ aFraction class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   772
	numerator:n
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   773
	denominator:d
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   774
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   775
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   776
     ((1/3) asFixedPoint:2) - (1/3)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   777
     ((1/3) asFixedPoint:2) - (2/3)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   778
    "
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   779
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   780
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   781
differenceFromInteger:anInteger
213
3b56a17534fd *** empty log message ***
claus
parents: 92
diff changeset
   782
    "sent when an integer does not know how to subtract the receiver, a fraction"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   783
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   784
    ^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   785
	numerator:((anInteger * denominator) - numerator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   786
	denominator:denominator
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   787
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   788
    "Modified: 28.7.1997 / 19:08:53 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   789
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   791
equalFromFraction:aFraction
7571
57d86ad2aded fixed comparing agains integer for subclasses
Claus Gittinger <cg@exept.de>
parents: 7442
diff changeset
   792
    denominator = aFraction denominator ifFalse:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   793
	^ false   " must always be reduced "
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   794
	"/ ^ (numerator * aFraction denominator) = (aFraction numerator * denominator)
7571
57d86ad2aded fixed comparing agains integer for subclasses
Claus Gittinger <cg@exept.de>
parents: 7442
diff changeset
   795
    ].
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   796
    ^ numerator = aFraction numerator
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   797
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   798
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   799
equalFromInteger:anInteger
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   800
    "sent when an integer does not know how to compare to the receiver, a fraction"
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   801
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   802
    "as I am always reduced, this test should not be required.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   803
     However, it is here for subclasses and to allow comparing unnormalized fractions,
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   804
     which might be encountered internally"
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   805
7571
57d86ad2aded fixed comparing agains integer for subclasses
Claus Gittinger <cg@exept.de>
parents: 7442
diff changeset
   806
    denominator = 1 ifFalse:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   807
	^ numerator = (anInteger * denominator)
7571
57d86ad2aded fixed comparing agains integer for subclasses
Claus Gittinger <cg@exept.de>
parents: 7442
diff changeset
   808
    ].
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   809
    ^ numerator = anInteger
7571
57d86ad2aded fixed comparing agains integer for subclasses
Claus Gittinger <cg@exept.de>
parents: 7442
diff changeset
   810
57d86ad2aded fixed comparing agains integer for subclasses
Claus Gittinger <cg@exept.de>
parents: 7442
diff changeset
   811
    "
57d86ad2aded fixed comparing agains integer for subclasses
Claus Gittinger <cg@exept.de>
parents: 7442
diff changeset
   812
     1 = (1 asFixedPoint:1)
57d86ad2aded fixed comparing agains integer for subclasses
Claus Gittinger <cg@exept.de>
parents: 7442
diff changeset
   813
     (1 asFixedPoint:1) = 1
57d86ad2aded fixed comparing agains integer for subclasses
Claus Gittinger <cg@exept.de>
parents: 7442
diff changeset
   814
    "
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   815
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   816
10486
ecab71364dab new: #lessEqFromInteger:
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   817
lessEqFromInteger:anInteger
ecab71364dab new: #lessEqFromInteger:
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   818
    "sent when an integer does not know how to compare to the receiver, a fraction"
ecab71364dab new: #lessEqFromInteger:
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   819
ecab71364dab new: #lessEqFromInteger:
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   820
    ^ (denominator * anInteger) <= numerator
ecab71364dab new: #lessEqFromInteger:
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   821
!
ecab71364dab new: #lessEqFromInteger:
Stefan Vogel <sv@exept.de>
parents: 8913
diff changeset
   822
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   823
lessFromFraction:aFraction
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   824
    "sent when a fraction does not know how to compare to the receiver"
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   825
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   826
    |n d|
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   827
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   828
    d := aFraction denominator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   829
    n := aFraction numerator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   830
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   831
    "/ save a multiplication if possible
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   832
    d == denominator ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   833
	^ n < numerator
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   834
    ].
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   835
    ^ (denominator * n) < (numerator * d)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   836
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   837
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   838
lessFromInteger:anInteger
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   839
    "sent when an integer does not know how to compare to the receiver, a fraction"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   840
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   841
    ^ (denominator * anInteger) < numerator
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   842
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   843
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   844
productFromFixedPoint:aFixedPoint
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   845
    ^ aFixedPoint class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   846
	numerator:(aFixedPoint numerator * numerator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   847
	denominator:(aFixedPoint denominator * denominator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   848
	scale:(aFixedPoint scale)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   849
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   850
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   851
     ((1/3) asFixedPoint:2) * 2
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   852
     ((1/3) asFixedPoint:2) * (1/2)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   853
     ((1/3) asFixedPoint:2) * (3/2)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   854
    "
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   855
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   856
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   857
productFromFloat:aFloat
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   858
    "sent when a float does not know how to multiply the receiver, a fraction"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   859
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   860
    ^ aFloat * numerator / denominator
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   861
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   862
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   863
productFromFraction:aFraction
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   864
    ^ aFraction class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   865
	numerator:(aFraction numerator * numerator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   866
	denominator:(aFraction denominator * denominator)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   867
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   868
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   869
     ((1/3) asFixedPoint:2) * 2
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   870
     ((1/3) asFixedPoint:2) * (1/2)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   871
     ((1/3) asFixedPoint:2) * (3/2)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   872
    "
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   873
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   874
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   875
productFromInteger:anInteger
213
3b56a17534fd *** empty log message ***
claus
parents: 92
diff changeset
   876
    "sent when an integer does not know how to multiply the receiver, a fraction"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   877
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   878
    ^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   879
	numerator:(anInteger * numerator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   880
	denominator:denominator
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   881
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   882
    "Modified: 28.7.1997 / 19:06:22 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   883
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   884
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   885
quotientFromFixedPoint:aFixedPoint
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   886
    "Return the quotient of the argument, aFixedPoint and the receiver.
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   887
     Sent when aFixedPoint does not know how to divide by the receiver."
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   888
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   889
    ^ aFixedPoint class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   890
	numerator:(aFixedPoint numerator * denominator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   891
	denominator:(aFixedPoint denominator * numerator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   892
	scale:(aFixedPoint scale)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   893
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   894
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   895
     ((1/3) asFixedPoint:2) / 2
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   896
     ((1/3) asFixedPoint:2) / (1/2)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   897
    "
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   898
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   899
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   900
quotientFromFloat:aFloat
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   901
    "Return the quotient of the argument, aFloat and the receiver.
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   902
     Sent when aFloat does not know how to divide by the receiver."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   903
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   904
    ^ (aFloat * denominator) / numerator
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   905
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   906
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   907
quotientFromFraction:aFraction
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   908
    "Return the quotient of the argument, aFraction and the receiver.
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   909
     Sent when aFraction does not know how to divide by the receiver."
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   910
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   911
    ^ aFraction class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   912
	numerator:(aFraction numerator * denominator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   913
	denominator:(aFraction denominator * numerator)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   914
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   915
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   916
     (1/3) / (1/2)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   917
     (1/3) / (3/2)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   918
    "
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   919
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   920
324
290cfb34ec93 *** empty log message ***
claus
parents: 302
diff changeset
   921
quotientFromInteger:anInteger
7442
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   922
    "Return the quotient of the argument, anInteger and the receiver.
1b0a20747a64 double dispatching
Claus Gittinger <cg@exept.de>
parents: 7403
diff changeset
   923
     Sent when anInteger does not know how to divide by the receiver."
324
290cfb34ec93 *** empty log message ***
claus
parents: 302
diff changeset
   924
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   925
    ^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   926
	numerator:(anInteger * denominator)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   927
	denominator:numerator
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   928
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   929
    "Modified: 28.7.1997 / 19:08:46 / cg"
324
290cfb34ec93 *** empty log message ***
claus
parents: 302
diff changeset
   930
!
290cfb34ec93 *** empty log message ***
claus
parents: 302
diff changeset
   931
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   932
sumFromFixedPoint:aFixedPoint
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   933
    |n d otherDenominator otherNumerator|
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   934
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   935
    otherDenominator := aFixedPoint denominator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   936
    otherNumerator := aFixedPoint numerator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   937
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   938
    "save a multiplication if possible"
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   939
    otherDenominator == denominator ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   940
	n := otherNumerator + numerator.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   941
	d := otherDenominator.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   942
    ] ifFalse:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   943
	n := (otherNumerator * denominator) + (numerator * otherDenominator).
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   944
	d := otherDenominator * denominator.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   945
    ].
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   946
    ^ aFixedPoint class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   947
	numerator:n
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   948
	denominator:d
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   949
	scale:(aFixedPoint scale)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   950
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   951
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   952
     ((1/3) asFixedPoint:2) + (1/3)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   953
     ((1/3) asFixedPoint:2) + (2/3)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   954
    "
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   955
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   956
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   957
sumFromFloat:aFloat
213
3b56a17534fd *** empty log message ***
claus
parents: 92
diff changeset
   958
    "sent when a float does not know how to add the receiver, a fraction"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   959
a27a279701f8 Initial revision
claus
parents:
diff changeset
   960
    ^ (aFloat * denominator + numerator) / denominator
a27a279701f8 Initial revision
claus
parents:
diff changeset
   961
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   962
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   963
sumFromFraction:aFraction
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   964
    |n d otherDenominator otherNumerator|
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   965
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   966
    otherDenominator := aFraction denominator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   967
    otherNumerator := aFraction numerator.
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   968
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   969
    "save a multiplication if possible"
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   970
    otherDenominator == denominator ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   971
	n := otherNumerator + numerator.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   972
	d := otherDenominator.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   973
    ] ifFalse:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   974
	n := (otherNumerator * denominator) + (numerator * otherDenominator).
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   975
	d := otherDenominator * denominator.
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   976
    ].
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   977
    ^ aFraction class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   978
	numerator:n
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   979
	denominator:d
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   980
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   981
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   982
     (1/3) + (1/3)
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   983
     (1/3) + (2/3)
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   984
    "
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   985
!
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
   986
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   987
sumFromInteger:anInteger
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   988
    "sent when an integer does not know how to add the receiver, a fraction"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   989
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   990
    ^ self class
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   991
	numerator:(numerator + (anInteger * denominator))
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
   992
	denominator:denominator
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
   993
2792
2ae1f2e3d11f checkin from browser
Claus Gittinger <cg@exept.de>
parents: 2790
diff changeset
   994
    "Modified: 28.7.1997 / 19:08:40 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   995
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   996
92
0c73b48551ac *** empty log message ***
claus
parents: 88
diff changeset
   997
!Fraction methodsFor:'printing & storing'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   998
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
   999
printOn:aStream
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
  1000
    "append a printed representation of the receiver to the
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
  1001
     argument, aStream"
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
  1002
6675
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
  1003
    |t|
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
  1004
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
  1005
    PrintWholeNumbers == true ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1006
	"/ experimental: print fractions which are greater than 1 as a sum of
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1007
	"/ an integral and the fractional part. They are easier to read this way.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1008
	numerator > denominator ifTrue:[
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1009
	    aStream nextPut:$(.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1010
	    t := numerator // denominator.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1011
	    t printOn:aStream.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1012
	    aStream nextPutAll:'+('.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1013
	    (numerator - (t*denominator)) printOn:aStream.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1014
	    aStream nextPut:$/.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1015
	    denominator printOn:aStream.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1016
	    aStream nextPutAll:'))'.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1017
	    ^ self
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1018
	].
6675
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
  1019
    ].
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
  1020
54
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
  1021
    aStream nextPut:$(.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
  1022
    numerator printOn:aStream.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
  1023
    aStream nextPut:$/.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
  1024
    denominator printOn:aStream.
06dbdeeed4f9 *** empty log message ***
claus
parents: 44
diff changeset
  1025
    aStream nextPut:$)
6675
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
  1026
c7e2757d5e80 documentation comment
Claus Gittinger <cg@exept.de>
parents: 6650
diff changeset
  1027
    "Modified: / 31.7.2002 / 09:56:41 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1028
! !
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1029
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1030
!Fraction methodsFor:'private'!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1031
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1032
reduced
7139
958ca5839e25 comment
Claus Gittinger <cg@exept.de>
parents: 6891
diff changeset
  1033
    "reduce the receiver; divide the numerator and denominator by their
958ca5839e25 comment
Claus Gittinger <cg@exept.de>
parents: 6891
diff changeset
  1034
     greatest common divisor; if the result is integral, return an Integer.
958ca5839e25 comment
Claus Gittinger <cg@exept.de>
parents: 6891
diff changeset
  1035
     Otherwise, return the normalized receiver.
11250
9a962a088d30 comment
Claus Gittinger <cg@exept.de>
parents: 11239
diff changeset
  1036
     CAVEAT: bad name; should be called reduce, as it has a side effect
9a962a088d30 comment
Claus Gittinger <cg@exept.de>
parents: 11239
diff changeset
  1037
     (i.e. this is destructive wrt. the instance values)."
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1038
2790
495b8ea6a4cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2789
diff changeset
  1039
    |gcd den|
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1040
2790
495b8ea6a4cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2789
diff changeset
  1041
    den := denominator.
495b8ea6a4cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2789
diff changeset
  1042
    den < 0 ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1043
	numerator := numerator negated.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1044
	den := denominator := den negated.
2789
e3e8707d26b4 make certain, that denominator is positive (in #reduce)
Claus Gittinger <cg@exept.de>
parents: 2140
diff changeset
  1045
    ].
e3e8707d26b4 make certain, that denominator is positive (in #reduce)
Claus Gittinger <cg@exept.de>
parents: 2140
diff changeset
  1046
2790
495b8ea6a4cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2789
diff changeset
  1047
    den == 1 ifTrue:[^ numerator].
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1048
    numerator == 1 ifTrue:[^ self].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1049
    numerator == 0 ifTrue:[^ 0].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1050
2790
495b8ea6a4cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2789
diff changeset
  1051
    gcd := numerator gcd:den.
495b8ea6a4cb *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 2789
diff changeset
  1052
    (gcd ~~ 1) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1053
	gcd < 0 ifTrue:[
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1054
	     gcd := gcd negated.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1055
	].
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1056
	numerator := numerator // gcd.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1057
	denominator := den := den // gcd.
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1058
	(den == 1) ifTrue:[^ numerator].
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1059
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1060
    ^ self
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1061
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1062
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1063
setNumerator:num denominator:den
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1064
    "set both numerator and denominator"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1065
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1066
    numerator := num.
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1067
    denominator := den
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1068
! !
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1069
6650
35de1d8400b2 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 6646
diff changeset
  1070
!Fraction methodsFor:'testing'!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1071
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1072
isFraction
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1073
    "return true, if the receiver is some kind of fraction;
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1074
     true is returned here - the method is redefined from Object."
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1075
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1076
    ^ true
6650
35de1d8400b2 *** empty log message ***
Stefan Vogel <sv@exept.de>
parents: 6646
diff changeset
  1077
!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1078
4658
1a74754fbe91 moved isLiteral (complex and FixedPoint are not)
Claus Gittinger <cg@exept.de>
parents: 4594
diff changeset
  1079
isLiteral
1a74754fbe91 moved isLiteral (complex and FixedPoint are not)
Claus Gittinger <cg@exept.de>
parents: 4594
diff changeset
  1080
    "return true, if the receiver can be used as a literal constant in ST syntax
1a74754fbe91 moved isLiteral (complex and FixedPoint are not)
Claus Gittinger <cg@exept.de>
parents: 4594
diff changeset
  1081
     (i.e. can be used in constant arrays)"
1a74754fbe91 moved isLiteral (complex and FixedPoint are not)
Claus Gittinger <cg@exept.de>
parents: 4594
diff changeset
  1082
1a74754fbe91 moved isLiteral (complex and FixedPoint are not)
Claus Gittinger <cg@exept.de>
parents: 4594
diff changeset
  1083
    ^ true
1a74754fbe91 moved isLiteral (complex and FixedPoint are not)
Claus Gittinger <cg@exept.de>
parents: 4594
diff changeset
  1084
1a74754fbe91 moved isLiteral (complex and FixedPoint are not)
Claus Gittinger <cg@exept.de>
parents: 4594
diff changeset
  1085
!
1a74754fbe91 moved isLiteral (complex and FixedPoint are not)
Claus Gittinger <cg@exept.de>
parents: 4594
diff changeset
  1086
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1087
negative
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1088
    "return true if the receiver is negative"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1089
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1090
    (numerator < 0) ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1091
	^ (denominator < 0) not
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1092
    ].
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1093
    ^ (denominator < 0)
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1094
! !
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1095
5552
31b5cc144476 category changes
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
  1096
!Fraction methodsFor:'truncation & rounding'!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1097
3899
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1098
fractionPart
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
  1099
    "extract the after-decimal fraction part,
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
  1100
     such that (self truncated + self fractionPart) = self"
3899
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1101
6153
e92766db42c6 integerPart and fractionPart fixed for negative numbers
Claus Gittinger <cg@exept.de>
parents: 6064
diff changeset
  1102
    numerator abs < denominator abs ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1103
	^ self
3899
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1104
    ].
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
  1105
    ^ (numerator rem: denominator) / denominator
3899
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1106
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1107
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1108
     (3/2) fractionPart + (3/2) truncated
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1109
     (-3/2) fractionPart + (-3/2) truncated
7355
96f466eeddf5 double dispatching fixed;
Claus Gittinger <cg@exept.de>
parents: 7140
diff changeset
  1110
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1111
     (3/2) fractionPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1112
     (-3/2) fractionPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1113
     (3/2) asFloat fractionPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1114
     (-3/2) asFloat fractionPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1115
     (2/3) fractionPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1116
     ((3/2)*(15/4)) fractionPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1117
     ((2/3)*(4/15)) fractionPart
3899
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1118
    "
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1119
6153
e92766db42c6 integerPart and fractionPart fixed for negative numbers
Claus Gittinger <cg@exept.de>
parents: 6064
diff changeset
  1120
    "Modified: / 5.11.2001 / 17:55:25 / cg"
3899
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1121
!
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1122
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1123
integerPart
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1124
    "extract the pre-decimal integer part."
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1125
6153
e92766db42c6 integerPart and fractionPart fixed for negative numbers
Claus Gittinger <cg@exept.de>
parents: 6064
diff changeset
  1126
    numerator abs < denominator abs ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1127
	^ 0
3899
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1128
    ].
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1129
    ^ super integerPart
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1130
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1131
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1132
     (3/2) integerPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1133
     (-3/2) integerPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1134
     (2/3) integerPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1135
     ((3/2)*(15/4)) integerPart
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1136
     ((2/3)*(4/15)) integerPart
3899
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1137
    "
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1138
6153
e92766db42c6 integerPart and fractionPart fixed for negative numbers
Claus Gittinger <cg@exept.de>
parents: 6064
diff changeset
  1139
    "Modified: / 5.11.2001 / 17:55:01 / cg"
3899
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1140
!
aa9b50cdfced added #fractionPart and #integerPart
Claus Gittinger <cg@exept.de>
parents: 3631
diff changeset
  1141
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1142
rounded
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1143
    "return the receiver rounded to the nearest integer as integer"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1144
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1145
    "/ mhmh - what about -(1/2)
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1146
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1147
    |t|
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1148
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1149
    self negative ifTrue:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1150
	t := self - (1/2)
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1151
    ] ifFalse:[
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1152
	t := self + (1/2)
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1153
    ].
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1154
    ^ t truncated.
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1155
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1156
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1157
     (1/3) rounded
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1158
     (1/3) negated rounded
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1159
     (1/2) rounded
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1160
     (1/2) negated rounded
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1161
     0.5 rounded
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1162
     -0.5 rounded
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1163
     (2/3) rounded
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1164
     (2/3) negated rounded
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1165
    "
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1166
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1167
    "Modified: 5.11.1996 / 11:32:32 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1168
!
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1169
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1170
truncated
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1171
    "return the receiver truncated towards zero as Integer"
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1172
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1173
    ^ numerator quo: denominator
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1174
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1175
    "
18239
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1176
     (3/2) truncated
1f10572b7324 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 16938
diff changeset
  1177
     (3/2) negated truncated
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1178
    "
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1179
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1180
    "Modified: 5.11.1996 / 12:18:46 / cg"
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1181
! !
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1182
8395
6bd97113cb4c Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7859
diff changeset
  1183
!Fraction methodsFor:'visiting'!
6bd97113cb4c Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7859
diff changeset
  1184
6bd97113cb4c Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7859
diff changeset
  1185
acceptVisitor:aVisitor with:aParameter
16729
0cf2bfd45072 comment/format only
Claus Gittinger <cg@exept.de>
parents: 15278
diff changeset
  1186
    "dispatch for visitor pattern; send #visitFraction:with: to aVisitor"
8395
6bd97113cb4c Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7859
diff changeset
  1187
6bd97113cb4c Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7859
diff changeset
  1188
    ^ aVisitor visitFraction:self with:aParameter
6bd97113cb4c Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7859
diff changeset
  1189
! !
6bd97113cb4c Generalize visitor pattern and define #visit...:with: -methods instead
Stefan Vogel <sv@exept.de>
parents: 7859
diff changeset
  1190
1878
5615af5e7f47 fixed truncated & rounded for negative fractions
Claus Gittinger <cg@exept.de>
parents: 1556
diff changeset
  1191
!Fraction class methodsFor:'documentation'!
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1192
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1193
version
18240
28af09029a8b ifdef for SCHTEAM engine changed (not relevant for ST/X)
Claus Gittinger <cg@exept.de>
parents: 18239
diff changeset
  1194
    ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.86 2015-04-20 10:48:54 cg Exp $'
13357
487c502b40b7 comment/format in: #pi
Claus Gittinger <cg@exept.de>
parents: 11901
diff changeset
  1195
!
487c502b40b7 comment/format in: #pi
Claus Gittinger <cg@exept.de>
parents: 11901
diff changeset
  1196
487c502b40b7 comment/format in: #pi
Claus Gittinger <cg@exept.de>
parents: 11901
diff changeset
  1197
version_CVS
18240
28af09029a8b ifdef for SCHTEAM engine changed (not relevant for ST/X)
Claus Gittinger <cg@exept.de>
parents: 18239
diff changeset
  1198
    ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.86 2015-04-20 10:48:54 cg Exp $'
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1199
! !
6891
212aa8576cf7 oops - did not compare correctly against unnormalized numbers
Claus Gittinger <cg@exept.de>
parents: 6675
diff changeset
  1200
15278
ddf05cd996da class: Fraction
Claus Gittinger <cg@exept.de>
parents: 13357
diff changeset
  1201
701
a309e3ef7faf checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
  1202
Fraction initialize!