The Trunk: Kernel-eem.1335.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-eem.1335.mcz

commits-2
Eliot Miranda uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-eem.1335.mcz

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

Name: Kernel-eem.1335
Author: eem
Time: 21 July 2020, 12:33:42.401688 pm
UUID: 829e7c17-0cb2-4269-a6ca-d85bef9ecc2a
Ancestors: Kernel-mt.1334

Support for FloatArray; add 64-bit duals of the 32-bit float converters, so along side Float>>asIEEE32BitWord & Float class>>fromIEEE32Bit: we have Float>>asIEEE64BitWord & Float class>>fromIEEE64Bit:.

=============== Diff against Kernel-mt.1334 ===============

Item was added:
+ ----- Method: Float class>>fromIEEE64Bit: (in category 'instance creation') -----
+ fromIEEE64Bit: anInteger
+ "Convert the given 64 bit word (which is supposed to be a positive 64-bit value) from
+  a 64 bit IEEE floating point representation into an actual Squeak float object (being
+  64 bits wide). Should only be used for conversion in FloatArrays or likewise objects."
+ | value |
+ value := self basicNew: 2.
+ value
+ basicAt: 1 put: (anInteger bitShift: -32);
+ basicAt: 2 put: (anInteger bitAnd: 16rFFFFFFFF).
+ ^value isFinite
+ ifTrue: [value * 1.0] "reduce to SmallFloat64 if possible"
+ ifFalse: [value]!

Item was changed:
  ----- Method: Float>>asIEEE32BitWord (in category 'converting') -----
  asIEEE32BitWord
  "Convert the receiver into a 32 bit Integer value representing the same number in IEEE 32 bit format.
+ Used for conversion in FloatArrays."
- Used for conversion in FloatArrays only."
 
+ | word1 word2 sign mantissa exponent truncatedBits mask roundToUpper |
- | word1 word2 sign mantissa exponent destWord truncatedBits mask roundToUpper |
 
  "skip fast positive and nnegative zero"
  self = 0.0 ifTrue: [^self basicAt: 1].
 
  "retrieve 64 bits of IEEE 754 double"
  word1 := self basicAt: 1.
  word2 := self basicAt: 2.
 
  "prepare sign exponent and mantissa of 32 bits float"
  sign := word1 bitAnd: 16r80000000.
  exponent := ((word1 bitShift: -20) bitAnd: 16r7FF) - 1023 + 127.
  mantissa := (word2 bitShift: -29) + ((word1 bitAnd:  16rFFFFF) bitShift: 3).
  truncatedBits := (word2 bitAnd: 16r1FFFFFFF).
 
  "We must now honour default IEEE rounding mode (round to nearest even)"
 
  "we are below gradual underflow, even if rounded to upper mantissa"
+ exponent < -24 ifTrue: [^sign]. "this can be negative zero"
- exponent < -24 ifTrue: [^sign "this can be negative zero"].
 
  "BEWARE: rounding occurs on less than 23bits when gradual underflow"
  exponent <= 0
  ifTrue:
  [mask := 1 bitShift: exponent negated.
  mantissa := mantissa bitOr: 16r800000.
  roundToUpper := (mantissa bitAnd: mask) isZero not
  and: [truncatedBits isZero not
  or: [(mantissa bitAnd: mask - 1) isZero not
  or: [(mantissa bitAnd: mask*2) isZero not]]].
  mantissa := mantissa bitShift: exponent - 1.
  "exponent := exponent + 1"]
  ifFalse:
  [roundToUpper := (truncatedBits bitAnd: 16r10000000) isZero not
  and: [(mantissa bitAnd: 16r1) isZero not
+ or: [(truncatedBits bitAnd: 16r0FFFFFFF) isZero not]]].
- or: [(truncatedBits bitAnd: 16r0FFFFFFF) isZero not]]
- ].
 
  "adjust mantissa and exponent due to IEEE rounding mode"
+ roundToUpper ifTrue:
+ [mantissa := mantissa + 1.
+ mantissa > 16r7FFFFF ifTrue:
+ [mantissa := 0.
+ exponent := exponent+1]].
- roundToUpper
- ifTrue:
- [mantissa := mantissa + 1.
- mantissa > 16r7FFFFF
- ifTrue:
- [mantissa := 0.
- exponent := exponent+1]].
 
+ exponent > 254 ifTrue: "Overflow"
+ [exponent := 255.
- exponent > 254 ifTrue: ["Overflow"
- exponent := 255.
  self isNaN
  ifTrue: [mantissa isZero
  ifTrue: ["BEWARE: do not convert a NaN to infinity due to truncatedBits"
  mantissa := 1]]
  ifFalse: [mantissa := 0]].
 
  "Encode the word"
+ ^(sign bitOr: ((exponent max: 0) bitShift: 23)) bitOr: mantissa!
- destWord := (sign bitOr: ((exponent max: 0) bitShift: 23)) bitOr: mantissa.
- ^ destWord!

Item was added:
+ ----- Method: Float>>asIEEE64BitWord (in category 'converting') -----
+ asIEEE64BitWord
+ "Convert the receiver into a 64 bit Integer value representing the same number in IEEE 64 bit format.
+ Used for conversion in FloatArrays."
+
+ ^((self basicAt: 1) bitShift: 32) + (self basicAt: 2)!