[squeakdev] The Trunk: Kernelnice.647.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Nov 2 18:50:56 UTC 2011
Nicolas Cellier uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernelnice.647.mcz
==================== Summary ====================
Name: Kernelnice.647
Author: nice
Time: 2 November 2011, 7:50:14.247 pm
UUID: 6837405900c34605bfb3615f3793071a
Ancestors: Kernelnice.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 Kernelnice.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!
More information about the Squeakdev
mailing list
