s.ducasse stéphane ducasse stephane.ducasse@univ-savoie.fr ducasse/r/~ducasse/ 1 numbers
Post on 17-Dec-2015
236 Views
Preview:
TRANSCRIPT
S.Ducasse 1
QuickTime™ and aTIFF (Uncompressed) decompressorare needed to see this picture.
Stéphane DucasseStephane.Ducasse@univ-savoie.frhttp://www.listic.univ-savoie.fr/~ducasse/
Numbers
S.Ducasse 2
License: CC-Attribution-ShareAlike 2.0http://creativecommons.org/licenses/by-sa/2.0/
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
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, **
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
S.Ducasse 6
Large Numbers•1000 factorial (try it)40238726007709377354370243392300398571937486421071463254379991042993851239862902059204420848696940480047998861
0197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
•1000 factorial /999 factorial• -> 1000
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
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
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
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
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”
• ....
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: #+
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
S.Ducasse 14
SummaryAutomatic coercionNumber kind addition
top related