The Trunk: Kernel-nice.316.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Kernel-nice.316.mcz

commits-2
Nicolas Cellier uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-nice.316.mcz

==================== Summary ====================

Name: Kernel-nice.316
Author: nice
Time: 2 December 2009, 5:34:34 am
UUID: b108354a-6b8e-8b48-8c9c-fc6c8b47b84c
Ancestors: Kernel-ar.315

Add the ANSI float characterization methods every other Smalltalk has but Squeak.
Also add #predecessor and #successor.
These changes are already in Pharo.

=============== Diff against Kernel-ar.315 ===============

Item was added:
+ ----- Method: Float>>predecessor (in category 'truncation and round off') -----
+ predecessor
+ | mantissa biasedExponent |
+ self isFinite ifFalse: [
+ (self isNaN or: [self negative]) ifTrue: [^self].
+ ^Float fmax].
+ self = 0.0 ifTrue: [^Float fmin negated].
+ mantissa := self significandAsInteger.
+ (mantissa isPowerOfTwo and: [self positive]) ifTrue: [mantissa := mantissa bitShift: 1].
+ biasedExponent := self exponent - mantissa highBit + 1.
+ ^self sign * (mantissa - self sign) asFloat timesTwoPower: biasedExponent!

Item was added:
+ ----- Method: Float class>>emin (in category 'constants') -----
+ emin
+ "Answer exponent of minimal normalized representable value"
+
+ ^-1022!

Item was added:
+ ----- Method: Float class>>fmax (in category 'constants') -----
+ fmax
+ "Answer the maximum finite floating point value representable."
+
+ ^MaxVal!

Item was added:
+ ----- Method: Float class>>emax (in category 'constants') -----
+ emax
+ "Answer exponent of maximal representable value"
+
+ ^1023!

Item was added:
+ ----- Method: Float class>>precision (in category 'constants') -----
+ precision
+ "Answer the apparent precision of the floating point representation.
+ That is the maximum number of radix-based digits (bits if radix=2) representable in floating point without round off error.
+ Technically, 52 bits are stored in the representation, and normalized numbers have an implied leading 1 that does not need to be stored.
+ Note that denormalized floating point numbers don't have the implied leading 1, and thus gradually loose precision.
+ This format conforms IEEE 754 double precision standard."
+
+ ^53!

Item was added:
+ ----- Method: Float class>>fminDenormalized (in category 'constants') -----
+ fminDenormalized
+ "Answer the minimum denormalized value representable."
+
+ ^1.0 timesTwoPower: MinValLogBase2!

Item was added:
+ ----- Method: Float class>>fminNormalized (in category 'constants') -----
+ fminNormalized
+ "Answer the minimum normalized value representable."
+
+ ^1.0 timesTwoPower: -1022!

Item was added:
+ ----- Method: Float>>successor (in category 'truncation and round off') -----
+ successor
+ | mantissa biasedExponent |
+ self isFinite ifFalse: [
+ (self isNaN or: [self positive]) ifTrue: [^self].
+ ^Float fmax negated].
+ self = 0.0 ifTrue: [^Float fmin].
+ mantissa := self significandAsInteger.
+ (mantissa isPowerOfTwo and: [self negative]) ifTrue: [mantissa := mantissa bitShift: 1].
+ biasedExponent := self exponent - mantissa highBit + 1.
+ ^self sign * (mantissa + self sign) asFloat timesTwoPower: biasedExponent!

Item was changed:
  ----- Method: Float>>truncated (in category 'truncation and round off') -----
  truncated
  "Answer with a SmallInteger equal to the value of the receiver without
  its fractional part. The primitive fails if the truncated value cannot be
  represented as a SmallInteger. In that case, the code below will compute
  a LargeInteger truncated value.
  Essential. See Object documentation whatIsAPrimitive. "
 
  <primitive: 51>
+ self isFinite ifFalse: [self error: 'Cannot truncate this number'].
- (self isInfinite or: [self isNaN]) ifTrue: [self error: 'Cannot truncate this number'].
 
  self abs < 2.0e16
  ifTrue: ["Fastest way when it may not be an integer"
- "^ (self quo: 1073741823.0) * 1073741823 + (self rem: 1073741823.0) truncated"
  | di df q r |
+ di := 1 + (SmallInteger maxVal bitShift: -1).
- di := (SmallInteger maxVal bitShift: -1)+1.
  df := di asFloat.
  q := self quo: df.
  r := self - (q asFloat * df).
+ ^q * di + r truncated]
- ^q*di+r truncated]
  ifFalse: [^ self asTrueFraction.  "Extract all bits of the mantissa and shift if necess"]
 
 
 
  !

Item was added:
+ ----- Method: Float class>>radix (in category 'constants') -----
+ radix
+ "Answer the radix used for internal floating point representation."
+
+ ^2!

Item was added:
+ ----- Method: Float class>>epsilon (in category 'constants') -----
+ epsilon
+ "Answer difference between 1.0 and previous representable value"
+
+ ^1.0 timesTwoPower: 1 - self precision!

Item was added:
+ ----- Method: Float class>>denormalized (in category 'constants') -----
+ denormalized
+ "Answer whether implementation supports denormalized numbers (also known as gradual underflow)."
+
+ ^true!

Item was added:
+ ----- Method: Float class>>fmin (in category 'constants') -----
+ fmin
+ "Answer minimum positive representable value."
+
+ ^self denormalized
+ ifTrue: [self fminDenormalized]
+ ifFalse: [self fminNormalized]!