s.ducasse stéphane ducasse [email protected] ducasse/r/~ducasse/ 1 numbers

14
S.Ducasse 1 QuickTime™ TIFF (Uncompr are needed t Stéphane Ducasse [email protected] http://www.listic.univ-savoie.f r/~ducasse/ Numbers

Upload: gwendolyn-dalton

Post on 17-Dec-2015

236 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 1

QuickTime™ and aTIFF (Uncompressed) decompressorare needed to see this picture.

Stéphane [email protected]://www.listic.univ-savoie.fr/~ducasse/

Numbers

Page 2: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 2

License: CC-Attribution-ShareAlike 2.0http://creativecommons.org/licenses/by-sa/2.0/

Page 3: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 3

•Arithmetic • 5 + 6, 5 - 6, 5 * 6, (division) 30 / 9, (integer

division) 30 // 9, (modulo) 30 \\ 9, (square root) 9 sqrt, (square) 3 squared

•Rounding• 3.8 ceiling -> 4, 3.8 floor -> 3, 3.811 roundTo:

0.01 -> 3.81

•Range• 30 between: 5 and: 40

Basic

3

Page 4: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 4

Basic (2)• Tests

• 3.8 isInteger, 3.8 even, 3.8 odd

•Signs• positive, negative, sign, negated

•Other• min:, max:, cos, ln, log, log: arcSin, exp, **

Page 5: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 5

•Smalltalk offers:• automatic coercion of numbers• infinite number• exact precision

• (7/11) + (4 /11)-> 1

• SmallInteger maxValue• Biggest small integer

• Smallest large number:• SmallInteger maxValue + 1:

Automatic Coercion

Page 6: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 6

Large Numbers•1000 factorial (try it)40238726007709377354370243392300398571937486421071463254379991042993851239862902059204420848696940480047998861

0197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

•1000 factorial /999 factorial• -> 1000

Page 7: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 7

• ArithmeticValue>>coerce: aNumber • "Answer a number representing the argument,

aNumber, that is the same kind of Number as the receiver. Must be defined by all Number classes."

^ self subclassResponsibility

• ArithmicValue>>generality• "Answer the number representing the ordering of

the receiver in the generality hierarchy. A number in this hierarchy coerces to numbers higher in hierarchy (i.e., with larger generality numbers)."

^ self subclassResponsibility

In VW Coercion & Generality

Page 8: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 8

In VW Coercion & Generality• Integer>>coerce: aNumber• "Convert a number to a compatible form• aNumber asInteger

• Integer>>generality ^40

• Generality: SmallInt 20, Integer 40, Fraction 60, FixedPoint 70, Float 80, Double 90

Page 9: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 9

ArithmeticValue>>sumFromInteger: anInteger"The argument anInteger, known to be a kind of integer, encountered a

problem on addition. Retry by coercing either anInteger or self, whichever is the less general arithmetic value." ^anInteger retry: #+ coercing: self

ArithmeticValue>>retry: aSymbol coercing: aNumber "Arithmetic represented by the symbol, aSymbol, could not be

performed with the receiver and the argument, aNumber, because of the differences in representation. Coerce either the receiver or the argument, depending on which has higher generality, and try again. If the generalities are the same, then this message should not have been sent so an error notification is provided." self generality < aNumber generality

ifTrue: [^(aNumber coerce: self) perform: aSymbol with: aNumber].

self generality > aNumber generalityifTrue: [^self perform: aSymbol with: (self coerce: aNumber)].

self error: 'coercion attempt failed'

#retry:coercing: in VW

Page 10: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 10

adaptToInteger:... in Squeak • Integer>>+ aNumber• "Refer to the comment in Number + "• aNumber isInteger ifTrue:• [self negative == aNumber negative• ifTrue: [^ (self digitAdd: aNumber) normalize]• ifFalse: [^ self digitSubtract: aNumber]].• ^ aNumber adaptToInteger: self andSend: #+

• Number>>adaptToInteger: rcvr andSend: selector• "If I am involved in arithmetic with a Integer, convert us and evaluate

exprBlock."• ^ self subclassResponsibility

• Float>>adaptToInteger: rcvr andSend: selector• "If I am involved in arithmetic with an Integer, convert it to a Float."• ^ rcvr asFloat perform: selector with: self

• Fraction>>adaptToInteger: rcvr andSend: selector• "If I am involved in arithmetic with an Integer, convert it to a Fraction."• ^ rcvr asFraction perform: selector with: self

Page 11: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 11

asFloat• Float>>asFloat• "Answer the receiver itself."

• ^self

• Fraction>>asFloat• "Answer a Float that closely approximates the value of the

receiver.• Ideally, answer the Float that most closely approximates the

receiver."

• ....• Integer>>asFloat• "Answer a Float that represents the value of the receiver.• Optimized to process only the significant digits of a LargeInteger”

• ....

Page 12: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 12

asFraction• Fraction>>asFraction• "Answer the receiver itself."

• ^self

• Integer>>asFraction• "Answer a Fraction that represents value of the the receiver."

• ^Fraction numerator: self denominator: 1

• ....• Float>>+ aNumber • "Primitive. Answer the sum of the receiver and aNumber. Essential.• Fail if the argument is not a Float. See Object documentation• whatIsAPrimitive."

• <primitive: 41>• ^ aNumber adaptToFloat: self andSend: #+

Page 13: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 13

•SmallInteger are objects in Smalltalk•No primitives types•But heavily optimized by the virtual

machine• tagged integer• for integers and other primitive types one bit

indicate that their value is coded differently than normal objects

About Pure OO

Page 14: S.Ducasse Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 Numbers

S.Ducasse 14

SummaryAutomatic coercionNumber kind addition