Nicolas Cellier uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-nice.647.mcz
==================== Summary ====================
Name: Kernel-nice.647 Author: nice Time: 2 November 2011, 7:50:14.247 pm UUID: 68374059-00c3-4605-bfb3-615f3793071a Ancestors: Kernel-nice.646
Optimize #ln and #log as in Pharo. 1) SmallInteger just inherits from super (^self asFloat log) 2) LargePositiveInteger can avoid self > à guard 3) LargeNegativeInteger can goto Error (no raise, just kidding) 4) Fraction can avoid arithmetic because (a/b) log = (a log - b log) and because a log or b log are unlikely to overflow - (10 raisedTo: (10 raisedTo: 308)) is likely to exhaust your memory before any overflow occurs ;).
=============== Diff against Kernel-nice.646 ===============
Item was changed: ----- Method: Fraction>>ln (in category 'mathematical functions') ----- ln + "This function is defined because super ln might overflow." + | res | - "This function is defined because super ln might overflow. - Note that < 1 is tested before converting to float in order to avoid precision loss due to gradual underflow." - | res int | self <= 0 ifTrue: [DomainError signal: 'ln is only defined for x > 0']. + "Test self < 1 before converting to float in order to avoid precision loss due to gradual underflow." + numerator < denominator ifTrue: [^self reciprocal ln negated]. - self < 1 ifTrue: [^self reciprocal ln negated]. res := super ln. res isFinite ifTrue: [^res]. + ^numerator ln - denominator ln! - int := self integerPart. - ^int ln + (self / int) ln!
Item was changed: ----- Method: Fraction>>log (in category 'mathematical functions') ----- log + "This function is defined because super log might overflow." + | res | - "This function is defined because super log might overflow. - Note that < 1 is tested before converting to float in order to avoid precision loss due to gradual underflow." - | res int | self <= 0 ifTrue: [DomainError signal: 'log is only defined for x > 0']. + "Test self < 1 before converting to float in order to avoid precision loss due to gradual underflow." + numerator < denominator ifTrue: [^self reciprocal log negated]. - self < 1 ifTrue: [^self reciprocal log negated]. res := super log. res isFinite ifTrue: [^res]. + ^numerator log - denominator log! - int := self integerPart. - ^int log + (self / int) log!
Item was removed: - ----- Method: Integer>>ln (in category 'mathematical functions') ----- - ln - "This function is defined because super ln might overflow." - | res h | - self <= 0 ifTrue: [DomainError signal: 'ln is only defined for x > 0']. - res := super ln. - res isFinite ifTrue: [^res]. - h := self highBit. - ^2 ln * h + (self / (1 << h)) asFloat ln!
Item was removed: - ----- Method: Integer>>log (in category 'mathematical functions') ----- - log - "This function is defined because super log might overflow." - | res h | - self <= 0 ifTrue: [DomainError signal: 'log is only defined for x > 0']. - res := super log. - res isFinite ifTrue: [^res]. - h := self highBit. - ^2 log * h + (self / (1 << h)) asFloat log!
Item was added: + ----- Method: LargeNegativeInteger>>ln (in category 'mathematical functions') ----- + ln + ^DomainError signal: 'ln is only defined for x > 0' from: 0!
Item was added: + ----- Method: LargeNegativeInteger>>log (in category 'mathematical functions') ----- + log + ^DomainError signal: 'log is only defined for x > 0' from: 0!
Item was added: + ----- Method: LargePositiveInteger>>ln (in category 'mathematical functions') ----- + ln + "This function is defined because super ln might overflow." + | res h | + res := super ln. + res isFinite ifTrue: [^res]. + h := self highBit. + ^2 ln * h + (self / (1 << h)) asFloat ln!
Item was added: + ----- Method: LargePositiveInteger>>log (in category 'mathematical functions') ----- + log + "This function is defined because super log might overflow." + | res h | + res := super log. + res isFinite ifTrue: [^res]. + h := self highBit. + ^2 log * h + (self / (1 << h)) asFloat log!
packages@lists.squeakfoundation.org