Nicolas Cellier uploaded a new version of Kernel to project The Trunk: http://source.squeak.org/trunk/Kernel-nice.1377.mcz
==================== Summary ====================
Name: Kernel-nice.1377 Author: nice Time: 4 March 2021, 10:10:29.295967 pm UUID: ddcc60af-76a7-4d50-b5e3-ebf4ff39eb07 Ancestors: Kernel-nice.1376
Fix log2 implementation to make it robust in the neighbourhood of 1.0.
Let aFloat isPowerOfTwo answer true if its value is a power of two. There is no obvious reason nor documentation why it should be false, and the implementation is neat.
Introduce isDenormal to test if a Float is denormalized. A denormalized Float is one with minimal exponent, and significand part gradually loosing significant bits (a.k.a. gradual underflow).
I.O.W, denormals loose precision. If we would define:
Float>>precision ^(self exponent - Float emin min: 0) + self class precision Then, we would have Float fminNormalized precision = Float precision. Float fminNormalized predecessor = (Float precision - 1). Float fminDenormalized precision = 1.
=============== Diff against Kernel-nice.1376 ===============
Item was added: + ----- Method: Float>>isDenormal (in category 'testing') ----- + isDenormal + "Return true if the receiver is a denormal." + + ^ self exponent < self class emin and: [self isZero not]!
Item was changed: ----- Method: Float>>isPowerOfTwo (in category 'testing') ----- isPowerOfTwo + "Return true if the receiver is an integral power of two." + ^self significand = 1.0! - "Return true if the receiver is an integral power of two. - Floats never return true here." - ^false!
Item was changed: ----- Method: Float>>log2 (in category 'mathematical functions') ----- log2 "Answer the base 2 logarithm of the receiver. Arrange to answer exact result in case of exact power of 2."
+ | s | + s := self significand. + ^s > 1.3333333333333333 + ifTrue: [(0.5 * s) ln / Ln2 + (1 + self exponent)] + ifFalse: [s ln / Ln2 + self exponent]! - ^ self significand ln / Ln2 + self exponent!
packages@lists.squeakfoundation.org