Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

11 - OOP - Numbers

752 views

Published on

Published in: Education
  • Be the first to comment

  • Be the first to like this

11 - OOP - Numbers

  1. 1. S.Ducasse 1 QuickTime™ and aTIFF (Uncompressed) decompressorare needed to see this picture. Stéphane Ducasse Stephane.Ducasse@univ-savoie.fr http://www.listic.univ-savoie.fr/~ducasse/ Numbers
  2. 2. S.Ducasse 2 License: CC-Attribution-ShareAlike 2.0 http://creativecommons.org/licenses/by-sa/2.0/
  3. 3. 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
  4. 4. 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, **
  5. 5. 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
  6. 6. S.Ducasse 6 Large Numbers • 1000 factorial (try it) 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479988610197196058 631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276120874975462497043601418 278094646496291056393887437886487337119181045825783647849977012476632889835955735432513185323958463075557409114262 417474349347553428646576611667797396668820291207379143853719588249808126867838374559731746136085379534524221586593 201928090878297308431392844403281231558611036976801357304216168747609675871348312025478589320767169132448426236131 412508780208000261683151027341827977704784635868170164365024153691398281264810213092761244896359928705114964975419 909342221566832572080821333186116811553615836546984046708975602900950537616475847728421889679646244945160765353408 198901385442487984959953319101723355556602139450399736280750137837615307127761926849034352625200015888535147331611 702103968175921510907788019393178114194545257223865541461062892187960223838971476088506276862967146674697562911234 082439208160153780889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642 956581746628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933 061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043367660176 999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594682573103790084024 432438465657245014402821885252470935190620929023136493273497565513958720559654228749774011413346962715422845862377 387538230483865688976461927383814900140767310446640259899490222221765904339901886018566526485061799702356193897017 860040811889729918311021171229845901641921068884387121855646124960798722908519296819372388642614839657382291123125 024186649353143970137428531926649875337218940694281434118520158014123344828015051399694290153483077644569099073152 433278288269864602789864321139083506217095002597389863554277196742822248757586765752344220207573630569498825087968 928162753848863396909959826280956121450994871701244516461260379029309120889086942028510640182154399457156805941872 748998094254742173582401063677404595741785160829230135358081840096996372524230560855903700624271243416909004153690 105933983835777939410970027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000 • 1000 factorial /999 factorial • -> 1000
  7. 7. 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 InVW Coercion & Generality
  8. 8. S.Ducasse 8 InVW 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
  9. 9. 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 generality ifTrue: [^self perform: aSymbol with: (self coerce: aNumber)]. self error: 'coercion attempt failed' #retry:coercing: inVW
  10. 10. 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
  11. 11. 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” • ....
  12. 12. 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>
  13. 13. 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
  14. 14. S.Ducasse 14 Summary Automatic coercion Number kind addition

×