Presentation is loading. Please wait.

Presentation is loading. Please wait.

S.Ducasse Stéphane Ducasse 1 Numbers.

Similar presentations


Presentation on theme: "S.Ducasse Stéphane Ducasse 1 Numbers."— Presentation transcript:

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

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

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 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 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 S.Ducasse 6 Large Numbers 1000 factorial (try it) 402387260077093773543702433923003985719374864210714632543799910429938512398629020592044208486969404800479 988610197196058631666872994808558901323829669944590997424504087073759918823627727188732519779505950995276 120874975462497043601418278094646496291056393887437886487337119181045825783647849977012476632889835955735 432513185323958463075557409114262417474349347553428646576611667797396668820291207379143853719588249808126 867838374559731746136085379534524221586593201928090878297308431392844403281231558611036976801357304216168 747609675871348312025478589320767169132448426236131412508780208000261683151027341827977704784635868170164 365024153691398281264810213092761244896359928705114964975419909342221566832572080821333186116811553615836 546984046708975602900950537616475847728421889679646244945160765353408198901385442487984959953319101723355 556602139450399736280750137837615307127761926849034352625200015888535147331611702103968175921510907788019 393178114194545257223865541461062892187960223838971476088506276862967146674697562911234082439208160153780 889893964518263243671616762179168909779911903754031274622289988005195444414282012187361745992642956581746 628302955570299024324153181617210465832036786906117260158783520751516284225540265170483304226143974286933 061690897968482590125458327168226458066526769958652682272807075781391858178889652208164348344825993266043 367660176999612831860788386150279465955131156552036093988180612138558600301435694527224206344631797460594 682573103790084024432438465657245014402821885252470935190620929023136493273497565513958720559654228749774 011413346962715422845862377387538230483865688976461927383814900140767310446640259899490222221765904339901 886018566526485061799702356193897017860040811889729918311021171229845901641921068884387121855646124960798 722908519296819372388642614839657382291123125024186649353143970137428531926649875337218940694281434118520 158014123344828015051399694290153483077644569099073152433278288269864602789864321139083506217095002597389 863554277196742822248757586765752344220207573630569498825087968928162753848863396909959826280956121450994 871701244516461260379029309120889086942028510640182154399457156805941872748998094254742173582401063677404 595741785160829230135358081840096996372524230560855903700624271243416909004153690105933983835777939410970 027753472000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000 1000 factorial /999 factorial -> 1000

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 In VW Coercion & Generality

8 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

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: in VW

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 "If I am involved in arithmetic with an Integer, convert it to a Fraction." ^ rcvr asFraction perform: selector with: self

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 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." ^ aNumber adaptToFloat: self andSend: #+

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 S.Ducasse 14 Summary Automatic coercion Number kind addition


Download ppt "S.Ducasse Stéphane Ducasse 1 Numbers."

Similar presentations


Ads by Google