IEEEFloat.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 5385 a54bf0f05ff5
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5357
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
     1
"{ Encoding: utf8 }"
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
     2
5385
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
     3
"
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
     4
 COPYRIGHT (c) 2018 by eXept Software AG
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
     5
              All Rights Reserved
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
     6
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
     7
 This software is furnished under a license and may be used
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
     8
 only in accordance with the terms of that license and with the
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    10
 be provided or otherwise made available to, or used by, any
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    11
 other person.  No title to or ownership of the software is
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    12
 hereby transferred.
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    13
"
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
"{ Package: 'stx:libbasic2' }"
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
"{ NameSpace: Smalltalk }"
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
LimitedPrecisionReal variableByteSubclass:#IEEEFloat
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	instanceVariableNames:'exponentSize'
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	classVariableNames:''
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	category:'Magnitude-Numbers'
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!IEEEFloat class methodsFor:'documentation'!
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
5385
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    27
copyright
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    28
"
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    29
 COPYRIGHT (c) 2018 by eXept Software AG
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    30
              All Rights Reserved
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    31
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    32
 This software is furnished under a license and may be used
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    33
 only in accordance with the terms of that license and with the
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    35
 be provided or otherwise made available to, or used by, any
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    36
 other person.  No title to or ownership of the software is
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    37
 hereby transferred.
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    38
"
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    39
!
a54bf0f05ff5 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 5364
diff changeset
    40
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
documentation
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
"
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    Unfinished, ongoing work
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    soft float emulation for arbitrary IEEE float formats.
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    This is very very slow and should only be used when importing 
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    funny sized floating point numbers (such as float24 or float8) from
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    external sources, or to simulate computations on otherwise unsupported floating pnt numbers.
5341
a5a32ee87cbc #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 5334
diff changeset
    49
a5a32ee87cbc #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 5334
diff changeset
    50
    Create one by passing the overall number of bits and the number of exponent-bits:
a5a32ee87cbc #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 5334
diff changeset
    51
        IEEEFloat size:64 exponentSize:(Float numBitsInExponent)
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
    52
    or:
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
    53
        1.0 asIEEEFloat
5341
a5a32ee87cbc #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 5334
diff changeset
    54
    will give you a (slow) variant of a regular float.
a5a32ee87cbc #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 5334
diff changeset
    55
a5a32ee87cbc #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 5334
diff changeset
    56
    And:
a5a32ee87cbc #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 5334
diff changeset
    57
        IEEEFloat size:256 exponentSize:19
a5a32ee87cbc #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 5334
diff changeset
    58
    will give you a 256 bit ieee float.
a5a32ee87cbc #DOCUMENTATION by exept
Claus Gittinger <cg@exept.de>
parents: 5334
diff changeset
    59
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
"
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
! !
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
!IEEEFloat class methodsFor:'instance creation'!
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    65
fromFloat:aFloat
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    66
    |nB f mantissaInclInt biasedExponent intBitMask matissaMask|
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    67
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    68
    nB := aFloat byteSize.
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    69
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    70
    "/ if there are integer bits in the characteristic (extended x86 floats),
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    71
    "/ we need one more byte and there is no hidden integer bit;    
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    72
    aFloat numBitsInIntegerPart > 0 ifTrue:[
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    73
        mantissaInclInt := aFloat mantissaBits.
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    74
        biasedExponent := aFloat exponent + aFloat eBias.
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    75
        matissaMask := (1 bitShift:aFloat numBitsInMantissa)-1. 
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    76
        intBitMask := (1 bitShift:aFloat numBitsInMantissa-1). 
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    77
        (mantissaInclInt bitTest:intBitMask) ifTrue:[
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    78
            "/ turn it off to make it hidden
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    79
            mantissaInclInt := mantissaInclInt bitClear:intBitMask.
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    80
            mantissaInclInt := mantissaInclInt bitShift:1.
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    81
            biasedExponent := biasedExponent - 1.
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    82
        ] ifFalse:[
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    83
            ((mantissaInclInt = 0) and:[biasedExponent == aFloat eBias]) ifTrue:[
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    84
                biasedExponent := 0.
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    85
            ] ifFalse:[
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    86
                self halt.
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    87
            ].
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    88
        ].
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    89
        ^ self size:nB*8 exponentSize:aFloat numBitsInExponent 
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    90
            fraction:mantissaInclInt exponent:biasedExponent signBit:(aFloat < 0 ifTrue:1 ifFalse:0)
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    91
    ].
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
    92
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    93
    f := self basicNew:nB.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    94
    1 to:nB do:[:i |
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    95
        f basicAt:i put:(aFloat byteAt:i)
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    96
    ].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    97
    f exponentSize:(aFloat numBitsInExponent).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    98
    ^ f
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
    99
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   100
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   101
     self fromFloat:1.0
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   102
     self fromFloat:2.0
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   103
     self fromFloat:1.0 asShortFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   104
     self fromFloat:2.0 asShortFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   105
     self fromFloat:1.0 asLongFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   106
     self fromFloat:2.0 asLongFloat
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
   107
     self fromFloat:3.0 asLongFloat
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
   108
     self fromFloat:101.0 asLongFloat
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
   109
     self fromFloat:0.0 asLongFloat
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
   110
     self fromFloat:0.5 asLongFloat
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   111
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   112
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   113
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   114
fromInteger:anInteger
5363
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   115
    "convert to one of 64, 128 or 256 bit IEEEFloat"
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   116
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   117
    |nM nE h l fraction e bias absInt nBytes|
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   118
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   119
    absInt := anInteger abs.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   120
    h := absInt highBit.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   121
    l := absInt lowBit.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   122
    nM := Float numBitsInMantissa.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   123
    nE := Float numBitsInExponent.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   124
    bias := Float eBias.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   125
    nBytes := 64 / 8.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   126
    (h - l) > nM ifTrue:[
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   127
        nM := QuadFloat numBitsInMantissa.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   128
        nE := QuadFloat numBitsInExponent.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   129
        bias := QuadFloat eBias.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   130
        nBytes := 128 / 8.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   131
        (h - l) > nM ifTrue:[
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   132
            nM := OctaFloat numBitsInMantissa.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   133
            nE := OctaFloat numBitsInExponent.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   134
            bias := OctaFloat eBias.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   135
            nBytes := 256 / 8.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   136
        ]
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   137
    ].
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   138
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   139
    "/ cut off precision by shifting right (if h > nM) 
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   140
    "/ or add zeros by shifting to the left 
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   141
    h == 0 ifTrue:[
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   142
        fraction := e := 0.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   143
    ] ifFalse:[
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   144
        fraction := absInt bitShift:(nM - h + 1). 
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   145
        fraction := fraction bitAnd:((1 bitShift:nM)-1).
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   146
        e := bias + h - 1.
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   147
    ].
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   148
    ^ (self basicNew:nBytes) exponentSize:nE;
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   149
        setFraction:fraction exponent:e 
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   150
        signBit:(anInteger negative ifTrue:[1] ifFalse:[0]);
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   151
        yourself
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   152
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   153
    "
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   154
     self fromInteger:1
5363
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   155
     self fromInteger:-1
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   156
     self fromInteger:2
5363
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   157
     self fromInteger:1024 * 1024 * 1024 * 1024 * 1024 * 1024
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   158
     self fromInteger:1e20 asInteger
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   159
     self fromInteger:1e100 asInteger
5363
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   160
     self fromInteger:2r1010101010101010101010101010101
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   161
     self fromInteger:2r1010101010101010101010101010101010101010101010101010101010101010
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   162
     self fromInteger:1e-100 asInteger
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   163
     1 asIEEEFloat
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   164
    "
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   165
!
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   166
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
size:numBits exponentSize:exponentSize
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
    ^ (self basicNew:(numBits // 8)) exponentSize:exponentSize
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    "
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
     self size:256 exponentSize:19
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   172
     self size:16 exponentSize:5
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   173
     self size:(1.0 basicSize * 8) exponentSize:(1.0 numBitsInExponent)
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   174
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   175
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   176
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
   177
size:numBits exponentSize:exponentSize fraction:normalizedFraction exponent:biasedExponent signBit:signBit
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   178
    ^ ((self basicNew:(numBits // 8)) exponentSize:exponentSize) 
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
   179
            setFraction:normalizedFraction exponent:biasedExponent signBit:signBit
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   180
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   181
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   182
     self size:256 exponentSize:19 fromInteger:1
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   183
     self size:256 exponentSize:19 fromInteger:2
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
   184
     self size:64 exponentSize:11 fraction:0 exponent:(0 + Float eBias) signBit:0
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
   185
     self size:64 exponentSize:11 fraction:0 exponent:0 signBit:0
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
    "
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
!
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
size:numBits exponentSize:exponentSize fromFloat:aFloat
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
    ^ ((self basicNew:(numBits // 8)) exponentSize:exponentSize) setValueFromFloat:aFloat
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
    "
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
     self size:256 exponentSize:19 fromFloat:1.0
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
     self size:256 exponentSize:19 fromFloat:2.0
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
    "
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
!
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
size:numBits exponentSize:exponentSize fromInteger:anInteger
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
    ^ ((self basicNew:(numBits // 8)) exponentSize:exponentSize) setValueFromInteger:anInteger
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    "
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
     self size:256 exponentSize:19 fromInteger:1
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
     self size:256 exponentSize:19 fromInteger:2
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
    "
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
! !
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   207
!IEEEFloat class methodsFor:'coercing & converting'!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   208
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   209
coerce:aNumber
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   210
    "convert the argument aNumber into an instance of the receiver (class) and return it."
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   211
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   212
    ^ aNumber asIEEEFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   213
! !
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   215
!IEEEFloat class methodsFor:'constants'!
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
5364
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   217
pi
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   218
    ^ Float pi
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   219
!
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   220
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   221
unity
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   222
    ^ 1.0
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   223
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   224
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   225
zero
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   226
    ^ 0.0
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
! !
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
!IEEEFloat methodsFor:'accessing'!
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   231
exponentBits
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   232
    "return the bits of my exponent.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   233
     These might be biased.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   234
     My bytes are stored LSB first; thus we have to fetch the high exponent bytes."
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   235
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   236
    |nBytes nExpBytes e|
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   237
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   238
    nBytes := self basicSize.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   239
    nExpBytes := (exponentSize + 1 + 7) // 8.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   240
    "/ seee eeee eeee mmmm mmmm ....
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   241
    "/ BAD: assumes LSB
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   242
    e := (self basicAt:nBytes) bitAnd:16r7F.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   243
    2 to:nExpBytes do:[:eI |
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   244
         e := (e bitShift:8) bitOr:(self basicAt:nBytes + 1 - eI)
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   245
    ].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   246
    "/ 0eee eeee eeee mmmm
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   247
    e := e rightShift:(nExpBytes * 8) - 1 "sign" - exponentSize.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   248
    "/ 0000 0eee eeee eeee 
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   249
    ^ e
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   250
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   251
    "
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   252
     1.0 asShortFloat asIEEEFloat
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   253
     (1 to:4) conform:[:i | (1.0 asShortFloat basicAt:i) = (1.0 asShortFloat asIEEEFloat basicAt:i)]
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   254
     1.0 asShortFloat exponentBits 
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   255
     1.0 asShortFloat asIEEEFloat exponentBits
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   256
     -1.0 asShortFloat exponentBits  
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   257
     -1.0 asShortFloat asIEEEFloat exponentBits   
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   258
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   259
     (self size:32 exponentSize:8) inspect.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   260
     (self size:64 exponentSize:11) inspect.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   261
     (self size:128 exponentSize:16) inspect.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   262
     (self size:256 exponentSize:16) inspect.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   263
    "
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   264
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   265
    "construct a soft-shortFloat
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   266
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   267
     |f sf|
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   268
     sf := 1.0 asShortFloat.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   269
     f := self size:(sf basicSize * 8) exponentSize:(sf numBitsInExponent).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   270
     1 to:sf basicSize do:[:i | f basicAt:i put:(sf basicAt:i)].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   271
     f inspect
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   272
    "
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   273
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   274
    "Modified: 12.2.1997 / 16:45:27 / cg"
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   275
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   276
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
exponentSize
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
    ^ exponentSize
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
!
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
exponentSize:something
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
    exponentSize := something.
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
!
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   285
mantissaBits
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   286
    "return the bits of my mantissa (incl. the hidden bit).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   287
     My bytes are stored LSB first."
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   288
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   289
    |bits hiddenBit mask c|
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   290
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   291
    bits := self digitBytes asIntegerMSB:false.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   292
    bits == 0 ifTrue:[^ 0].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   293
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   294
    hiddenBit := (1 bitShift:self numBitsInMantissa).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   295
    mask := hiddenBit-1.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   296
    c := bits bitAnd:mask.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   297
    "/ TODO: care for subnormals (exponent = 0)!!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   298
    ^ c bitOr:hiddenBit.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   299
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   300
    " 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   301
     (self size:32 exponentSize:8) inspect.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   302
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   303
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   304
   "construct a soft-shortFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   305
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   306
    |f sf|
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   307
    sf := 1.0 asShortFloat.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   308
    f := self size:(sf basicSize * 8) exponentSize:(sf numBitsInExponent).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   309
    1 to:sf basicSize do:[:i | f basicAt:i put:(sf basicAt:i)].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   310
    f inspect
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   311
   "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   312
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   313
    "Modified: 12.2.1997 / 16:45:27 / cg"
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   314
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   315
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   316
setFraction:normalizedFraction exponent:biasedExponent signBit:signBit
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   317
    |bits|
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   318
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   319
    bits := (normalizedFraction 
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   320
            bitOr:(biasedExponent bitShift:self numBitsInMantissa))
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   321
            bitOr:(signBit bitShift:(self basicSize * 8) - 1). 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   322
    1 to:self basicSize do:[:i | self basicAt:i put:(bits digitAt:i)].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   323
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   324
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   325
     (self size:64 exponentSize:11) setFraction:0 exponent:1024 signBit:0
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   326
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   327
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   328
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
setValueFromInteger:intValue
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   330
    "/ how many bits are there, in this int
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
    |absValue myNumBits numBitsInNumber shift|
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
    absValue := intValue abs. 
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
    numBitsInNumber := absValue highBit.
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
    myNumBits := (self basicSize * 8) - 1 "sign" - exponentSize.
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
    shift := myNumBits - numBitsInNumber. 
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
    numBitsInNumber > myNumBits ifTrue:[
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
        self halt.
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
    ] ifFalse:[
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
        "/ number:
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
        "/    1xxxxxxx...xxxxx
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
        "/ myRep:
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
        "/    seee...eeexxxxxxxxxx
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
        absValue digitLength to:1 by:-1 do:[:byteIndex |
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
            
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
        ].
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
    ].
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
    "/ cut off some bits
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
    "Float numBitsInExponent
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
     self size:16 exponentSize:4 fromInteger:1
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
     self size:32 exponentSize:11 fromInteger:1
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
     self size:256 exponentSize:19 fromInteger:1
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
     self size:256 exponentSize:19 fromInteger:2
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
    "
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
! !
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   360
!IEEEFloat methodsFor:'arithmetic'!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   361
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   362
* aNumber
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   363
    "/ thisContext isRecursive ifTrue:[self halt].
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   364
    ^ aNumber productFromIEEEFloat:self
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   365
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   366
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   367
+ aNumber
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   368
    "/ thisContext isRecursive ifTrue:[self halt].
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   369
    ^ aNumber sumFromIEEEFloat:self
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   370
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   371
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   372
     (-2.0 asIEEEFloat)
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   373
     (2.0 asIEEEFloat)
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   374
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   375
     self assert:((4.0 asIEEEFloat) + (2.0 asIEEEFloat)) = (6.0 asIEEEFloat)   
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   376
     self assert:((4.0 asIEEEFloat) + (-2.0 asIEEEFloat)) = (2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   377
     self assert:((-4.0 asIEEEFloat) + (-2.0 asIEEEFloat)) = (-6.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   378
     self assert:((-4.0 asIEEEFloat) + (2.0 asIEEEFloat)) = (-2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   379
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   380
     self assert:((2.0 asIEEEFloat) + (4.0 asIEEEFloat)) = (6.0 asIEEEFloat)   
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   381
     self assert:((2.0 asIEEEFloat) + (-4.0 asIEEEFloat)) = (-2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   382
     self assert:((-2.0 asIEEEFloat) + (-4.0 asIEEEFloat)) = (-6.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   383
     self assert:((-2.0 asIEEEFloat) + (4.0 asIEEEFloat)) = (2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   384
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   385
     self assert:((IEEEFloat fromFloat:0.1) + (IEEEFloat fromFloat:-0.1)) = (IEEEFloat fromFloat:0.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   386
     self assert:((IEEEFloat fromFloat:-0.1) + (IEEEFloat fromFloat:0.1)) = (IEEEFloat fromFloat:0.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   387
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   388
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   389
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   390
- aNumber
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   391
    "/ thisContext isRecursive ifTrue:[self halt].
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   392
    ^ aNumber differenceFromIEEEFloat:self
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   393
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   394
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   395
     self assert:((4.0 asIEEEFloat) - (2.0 asIEEEFloat)) = (2.0 asIEEEFloat)   
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   396
     self assert:((4.0 asIEEEFloat) - (-2.0 asIEEEFloat)) = (6.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   397
     self assert:((-4.0 asIEEEFloat) - (-2.0 asIEEEFloat)) = (-2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   398
     self assert:((-4.0 asIEEEFloat) - (2.0 asIEEEFloat)) = (-6.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   399
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   400
     self assert:((2.0 asIEEEFloat) - (4.0 asIEEEFloat)) = (-2.0 asIEEEFloat)   
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   401
     self assert:((2.0 asIEEEFloat) - (-4.0 asIEEEFloat)) = (6.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   402
     self assert:((-2.0 asIEEEFloat) - (-4.0 asIEEEFloat)) = (2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   403
     self assert:((-2.0 asIEEEFloat) - (4.0 asIEEEFloat)) = (-6.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   404
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   405
     self assert:((IEEEFloat fromFloat:0.1) - (IEEEFloat fromFloat:0.1)) = (IEEEFloat fromFloat:0.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   406
     self assert:((IEEEFloat fromFloat:0.1) - (IEEEFloat fromFloat:-0.1)) = (IEEEFloat fromFloat:0.2)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   407
     self assert:((IEEEFloat fromFloat:-0.1) - (IEEEFloat fromFloat:-0.1)) = (IEEEFloat fromFloat:0.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   408
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   409
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   410
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   411
/ aNumber
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   412
    "/ thisContext isRecursive ifTrue:[self halt].
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   413
    ^ aNumber quotientFromIEEEFloat:self
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   414
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   415
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   416
negated
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   417
    |f highByte|
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   418
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   419
    f := self copy.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   420
    highByte := self basicAt:(self basicSize).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   421
    f basicAt:(self basicSize) put:(highByte bitXor:16r80).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   422
    ^ f.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   423
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   424
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   425
     self assert:(IEEEFloat fromFloat:2.0) negated = (IEEEFloat fromFloat:-2.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   426
     self assert:(IEEEFloat fromFloat:2.0) negated negated = (IEEEFloat fromFloat:2.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   427
     self assert:(IEEEFloat fromFloat:-2.0) negated = (IEEEFloat fromFloat:2.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   428
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   429
! !
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   430
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   431
!IEEEFloat methodsFor:'coercing & converting'!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   432
5363
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   433
asIEEEFloat
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   434
    ^ self
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   435
!
1fa66e549cee #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5362
diff changeset
   436
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   437
coerce:aNumber
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   438
    "convert the argument aNumber into an instance of the receiver's class and return it.
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   439
     Redefined to preserve the size and exponentSize"
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   440
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   441
    |fraction e h nM|
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   442
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   443
    aNumber isInteger ifTrue:[
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   444
        nM := self numBitsInMantissa.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   445
        "/ cut off precision by shifting right (if h > nM) 
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   446
        "/ or add zeros by shifting to the left 
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   447
        h := aNumber highBit.
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   448
        h == 0 ifTrue:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   449
            fraction := e := 0.
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   450
        ] ifFalse:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   451
            fraction := aNumber bitShift:(nM - h + 1). 
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   452
            fraction := fraction bitAnd:((1 bitShift:nM)-1).
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   453
            e := self eBias + h - 1.
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   454
        ].
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   455
        ^ (self class basicNew:self basicSize) exponentSize:exponentSize;
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   456
            setFraction:fraction exponent:e 
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   457
            signBit:(aNumber negative ifTrue:[1] ifFalse:[0]);
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   458
            yourself
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   459
    ].
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   460
    ^ self class coerce:aNumber
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   461
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   462
    "Modified: / 15-06-2017 / 10:27:03 / cg"
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   463
!
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   464
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   465
generality
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   466
    ^ 97   "/ between OctaFloat and LargeFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   467
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   468
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   469
     1 asShortFloat generality 70
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   470
     1 asFloat generality      80
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   471
     1 asLongFloat generality  90
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   472
     1 asQuadFloat generality
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   473
     1 asQDouble generality    95
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   474
     1 asLargeFloat generality 100
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   475
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   476
! !
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   477
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   478
!IEEEFloat methodsFor:'comparing'!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   479
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   480
< aNumber
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   481
    "/ thisContext isRecursive ifTrue:[self halt].
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   482
    ^ aNumber lessFromIEEEFloat:self
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   483
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   484
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   485
= aNumber
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   486
    ^ aNumber equalFromIEEEFloat:self
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   487
! !
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   488
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   489
!IEEEFloat methodsFor:'double dispatching'!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   490
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   491
differenceFromIEEEFloat:anIEEEFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   492
    "/ anIEEEFloat - self
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   493
    self isZero ifTrue:[^ anIEEEFloat]. "/ otherwise, we might get a negative zero
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   494
    ^ self negated sumFromIEEEFloat:anIEEEFloat
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   495
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   496
    "
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   497
     0.0 + (0.0 negated)         
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   498
     (0.0 negated) + 0.0 
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   499
     0.0 asIEEEFloat + (0.0 negated)         
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   500
     (0.0 asIEEEFloat negated) + 0.0 
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   501
     0.0 asIEEEFloat + (0.0 asIEEEFloat negated)         
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   502
     (0.0 asIEEEFloat negated) + 0.0 asIEEEFloat
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   503
    "
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   504
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   505
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   506
equalFromIEEEFloat:anIEEEFloat
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   507
    |nBytes m1 m2 nM1 nM2 e1 e2|
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   508
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   509
    nBytes := self basicSize.
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   510
    anIEEEFloat basicSize == nBytes ifTrue:[
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   511
        anIEEEFloat exponentSize == exponentSize ifTrue:[
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   512
            1 to:nBytes-1 do:[:i |
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   513
                (self basicAt:i) = (anIEEEFloat basicAt:i) ifFalse:[^ false].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   514
            ].
5357
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   515
            "/ care for negative zero
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   516
            (self basicAt:nBytes) = (anIEEEFloat basicAt:nBytes) ifFalse:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   517
                ((self basicAt:nBytes) bitAnd:16r7F) == 0 ifTrue:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   518
                    ((anIEEEFloat basicAt:nBytes) bitAnd:16r7F) == 0 ifTrue:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   519
                        ^ true.
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   520
                    ].
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   521
                ].
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   522
                ^ false
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   523
            ].
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   524
            ^ true.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   525
        ].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   526
    ].
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   527
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   528
    "/ more complicated compare
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   529
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   530
    self negative = anIEEEFloat negative ifFalse:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   531
        ^ self isZero and:[anIEEEFloat isZero]
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   532
    ].
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   533
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   534
    "/ bring to same exponent, add m1 + m2, normalize
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   535
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   536
    m1 := anIEEEFloat mantissaBits. 
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   537
    m2 := self mantissaBits.        
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   538
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   539
    nM1 := anIEEEFloat numBitsInMantissa.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   540
    nM2 := self numBitsInMantissa.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   541
    nM1 ~= nM2 ifTrue:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   542
        nM1 > nM2 ifTrue:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   543
            m2 := m2 bitShift:(nM1-nM2).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   544
        ] ifFalse:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   545
            m1 := m1 bitShift:(nM2-nM1).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   546
        ].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   547
    ].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   548
    m1 = m2 ifFalse:[^ false].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   549
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   550
    e1 := anIEEEFloat exponentBits - anIEEEFloat eBias.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   551
    e2 := self exponentBits - self eBias.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   552
    e1 = e2 ifFalse:[^ false].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   553
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   554
    ^ true.
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   555
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   556
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   557
lessFromIEEEFloat:anIEEEFloat
5357
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   558
    |m1 m2 nM1 nM2 e1 e2 meNegative mySize myByte otherByte isLess|
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   559
5357
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   560
    meNegative := self negative.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   561
    meNegative = anIEEEFloat negative ifFalse:[
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   562
        ^ anIEEEFloat negative
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   563
    ].
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   564
5357
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   565
    "/ same sized floats can be compared easily
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   566
    "/ (but care for the negative 0)
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   567
    mySize := self basicSize.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   568
    mySize == anIEEEFloat basicSize ifTrue:[
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   569
        anIEEEFloat exponentSize == exponentSize ifTrue:[
5357
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   570
            "/ ignore the sign bit
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   571
            myByte := (self basicAt:mySize) bitAnd:16r7F.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   572
            otherByte := (anIEEEFloat basicAt:mySize) bitAnd:16r7F.    
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   573
            otherByte < myByte ifTrue:[
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   574
                ^ meNegative not
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   575
            ].
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   576
            otherByte > myByte ifTrue:[
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   577
                ^ meNegative
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   578
            ].
5357
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   579
            mySize-1 to:1 by:-1 do:[:i |
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   580
                myByte := self basicAt:i.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   581
                otherByte := anIEEEFloat basicAt:i.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   582
                otherByte < myByte ifTrue:[
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   583
                    ^ meNegative not
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   584
                ].
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   585
                otherByte > myByte ifTrue:[
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   586
                    ^ meNegative
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   587
                ].
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   588
            ].
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   589
            "/ same
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   590
            ^ false.
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   591
        ].
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   592
    ].
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   593
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   594
    "/ more complicated compare
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   595
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   596
    "/ bring to same exponent, add m1 + m2, normalize
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   597
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   598
    m1 := anIEEEFloat mantissaBits. 
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   599
    m2 := self mantissaBits.        
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   600
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   601
    nM1 := anIEEEFloat numBitsInMantissa.
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   602
    nM2 := self numBitsInMantissa.
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   603
    nM1 ~= nM2 ifTrue:[
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   604
        nM1 > nM2 ifTrue:[
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   605
            m2 := m2 bitShift:(nM1-nM2).
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   606
        ] ifFalse:[
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   607
            m1 := m1 bitShift:(nM2-nM1).
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   608
        ].
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   609
    ].
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   610
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   611
    e1 := anIEEEFloat exponent.
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   612
    e2 := self exponent.
5357
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   613
    isLess := e1 = e2 ifTrue:[m1 < m2] ifFalse:[e1 < e2].
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   614
    meNegative ifTrue:[^ isLess not].
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   615
    ^ isLess.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   616
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   617
    "
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   618
     self assert:(1.0 asIEEEFloat < 2.0 asIEEEFloat).
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   619
     self assert:(1.0 asIEEEFloat < 1.0 asIEEEFloat) not.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   620
     self assert:(1.0 asIEEEFloat < 0.0 asIEEEFloat) not.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   621
     self assert:(1.0 asIEEEFloat < -0.0 asIEEEFloat) not.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   622
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   623
     self assert:(-1.0 asIEEEFloat < 2.0 asIEEEFloat).
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   624
     self assert:(-1.0 asIEEEFloat < 1.0 asIEEEFloat).
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   625
     self assert:(-1.0 asIEEEFloat < 0.0 asIEEEFloat).
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   626
     self assert:(-1.0 asIEEEFloat < -0.0 asIEEEFloat).
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   627
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   628
     self assert:(1.0 asIEEEFloat < -2.0 asIEEEFloat) not.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   629
     self assert:(1.0 asIEEEFloat < -1.0 asIEEEFloat) not.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   630
     self assert:(1.0 asIEEEFloat < 0.0 asIEEEFloat) not.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   631
     self assert:(1.0 asIEEEFloat < -0.0 asIEEEFloat) not.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   632
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   633
     self assert:(-1.0 asIEEEFloat < -2.0 asIEEEFloat) not.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   634
     self assert:(-1.0 asIEEEFloat < -1.0 asIEEEFloat) not.
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   635
     self assert:(-1.0 asIEEEFloat < 0.0 asIEEEFloat).
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   636
     self assert:(-1.0 asIEEEFloat < -0.0 asIEEEFloat).
84fd4db36651 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5356
diff changeset
   637
    "
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   638
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   639
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   640
productFromIEEEFloat:anIEEEFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   641
    "/ anIEEEFloat * self
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   642
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   643
    |m1 m2 e1 e2 m e signBit hi shift nM1 nM2 nM|
5331
bd628a8e55a6 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
   644
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   645
    "/ m1 * m2 / e1 + e2
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   646
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   647
    m1 := anIEEEFloat mantissaBits. 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   648
    m2 := self mantissaBits.        
5358
339af06b05c9 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5357
diff changeset
   649
    (m1 = 0 or:[m2 = 0]) ifTrue:[
339af06b05c9 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5357
diff changeset
   650
        "/ care for the sign of the zero
339af06b05c9 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5357
diff changeset
   651
        ^ self class zero
339af06b05c9 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5357
diff changeset
   652
    ].
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   653
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   654
    nM1 := anIEEEFloat numBitsInMantissa.   
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   655
    nM2 := nM := self numBitsInMantissa.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   656
    nM1 ~= nM2 ifTrue:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   657
        nM1 > nM2 ifTrue:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   658
            m2 := m2 bitShift:(nM1-nM2).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   659
            nM := nM1
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   660
        ] ifFalse:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   661
            m1 := m1 bitShift:(nM2-nM1).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   662
            nM := nM2
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   663
        ].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   664
    ].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   665
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   666
    e1 := anIEEEFloat exponentBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   667
    e2 := self exponentBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   668
    e := (e1 - anIEEEFloat eBias) + (e2 - self eBias).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   669
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   670
    "/ 1xxxx....xxxx * 1xxxx....xxxx
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   671
    m := m1 * m2.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   672
    "/ now have nB bits too many
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   673
    e := e - nM.
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   674
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   675
    signBit := (self negative == anIEEEFloat negative) ifTrue:[0] ifFalse:[1].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   676
    m == 0 ifTrue:[self halt].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   677
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   678
    hi := m highBit.    
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   679
    shift := (nM + 1) - hi. 
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   680
    m := m bitShift:shift.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   681
    e := e - shift.
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   682
    m := m bitAnd:(1 bitShift:nM)-1. 
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   683
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   684
    e := e + self eBias.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   685
    ^ self class 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   686
        size:(self basicSize*8) exponentSize:exponentSize 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   687
        fraction:m exponent:e signBit:signBit.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   688
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   689
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   690
     self assert:((IEEEFloat fromFloat:1.0) * (IEEEFloat fromFloat:1.0)) = (IEEEFloat fromFloat:1.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   691
     self assert:((IEEEFloat fromFloat:1.0) * (IEEEFloat fromFloat:1.0)) exponent = 1.0 exponent
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   692
     self assert:((IEEEFloat fromFloat:1.0) * (IEEEFloat fromFloat:1.0)) mantissaBits = 1.0 mantissaBits
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   693
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   694
     self assert:((4.0 asIEEEFloat) * (2.0 asIEEEFloat)) = (8.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   695
     self assert:((-4.0 asIEEEFloat) * (2.0 asIEEEFloat)) = (-8.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   696
     self assert:((4.0 asIEEEFloat) * (-2.0 asIEEEFloat)) = (-8.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   697
     self assert:((-4.0 asIEEEFloat) * (-2.0 asIEEEFloat)) = (8.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   698
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   699
     self assert:((IEEEFloat fromFloat:100.0) * (IEEEFloat fromFloat:100.0)) = (IEEEFloat fromFloat:10000.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   700
     self assert:((IEEEFloat fromFloat:1e-20) * (IEEEFloat fromFloat:1e20)) = (IEEEFloat fromFloat:(1e-20 * 1e20)) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   701
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   702
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   703
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   704
quotientFromIEEEFloat:anIEEEFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   705
    "/ anIEEEFloat / self
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   706
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   707
    |m1 m2 e1 e2 m e signBit nM1 nM2 nM hi shift|
5331
bd628a8e55a6 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
   708
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   709
    "/ m1 / m2 / e1 - e2
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   710
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   711
    m1 := anIEEEFloat mantissaBits.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
   712
    m1 == 0 ifTrue:[^ anIEEEFloat ].
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   713
    m2 := self mantissaBits.        
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   714
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   715
    nM1 := anIEEEFloat numBitsInMantissa.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   716
    nM2 := nM := self numBitsInMantissa.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   717
    nM1 ~= nM2 ifTrue:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   718
        nM1 > nM2 ifTrue:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   719
            m2 := m2 bitShift:(nM1-nM2).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   720
            nM := nM1
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   721
        ] ifFalse:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   722
            m1 := m1 bitShift:(nM2-nM1).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   723
            nM := nM2
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   724
        ].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   725
    ].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   726
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   727
    e1 := anIEEEFloat exponentBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   728
    e2 := self exponentBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   729
    e := (e1 - anIEEEFloat eBias) - (e2 - self eBias).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   730
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   731
    "/ 1xxxx....xxxx / 1xxxx....xxxx
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   732
    m := (m1 bitShift:nM) // m2.
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   733
    "/ rest := m1 \\ m2.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   734
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   735
    signBit := (self negative == anIEEEFloat negative) ifTrue:[0] ifFalse:[1].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   736
    m == 0 ifTrue:[self halt].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   737
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   738
    hi := m highBit.    
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   739
    shift := (nM + 1) - hi. 
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   740
    m := m bitShift:shift.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   741
    e := e - shift.
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   742
    m := m bitAnd:(1 bitShift:nM)-1. 
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   743
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   744
    e := e + self eBias.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   745
    ^ self class 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   746
        size:(self basicSize*8) exponentSize:exponentSize 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   747
        fraction:m exponent:e signBit:signBit.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   748
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   749
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   750
     self assert:((IEEEFloat fromFloat:1.0) / (IEEEFloat fromFloat:1.0)) = (IEEEFloat fromFloat:1.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   751
     self assert:((IEEEFloat fromFloat:1.0) / (IEEEFloat fromFloat:1.0)) exponent = 1.0 exponent
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   752
     self assert:((IEEEFloat fromFloat:1.0) / (IEEEFloat fromFloat:1.0)) mantissaBits = 1.0 mantissaBits
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   753
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   754
     self assert:((4.0 asIEEEFloat) / (2.0 asIEEEFloat)) = (2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   755
     self assert:((-4.0 asIEEEFloat) / (2.0 asIEEEFloat)) = (-2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   756
     self assert:((4.0 asIEEEFloat) / (-2.0 asIEEEFloat)) = (-2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   757
     self assert:((-4.0 asIEEEFloat) / (-2.0 asIEEEFloat)) = (2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   758
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   759
     self assert:((IEEEFloat fromFloat:100.0) / (IEEEFloat fromFloat:2.0)) = (IEEEFloat fromFloat:50.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   760
     self assert:((IEEEFloat fromFloat:1e-20) / (IEEEFloat fromFloat:1e20)) = (IEEEFloat fromFloat:(1e-20 / 1e20)) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   761
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   762
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   763
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   764
sumFromIEEEFloat:anIEEEFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   765
    "/ anIEEEFloat + self
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   766
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   767
    |m1 m2 e1 e2 m e signBit hi shift nM1 nM2 nM|
5331
bd628a8e55a6 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
   768
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   769
    "/ bring to same exponent, add m1 + m2, normalize
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   770
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   771
    m1 := anIEEEFloat mantissaBits. 
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   772
    m1 == 0 ifTrue:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   773
        "/ always produce a positive zero
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   774
        self isZero ifTrue:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   775
            self negative ifTrue:[ ^ self copy basicAt:(self basicSize) put:0; yourself ].
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   776
        ].
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   777
        ^ self
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   778
    ].
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   779
    m2 := self mantissaBits.        
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   780
    m2 == 0 ifTrue:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   781
        anIEEEFloat isZero ifTrue:[
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   782
            anIEEEFloat negative ifTrue:[ ^ anIEEEFloat copy basicAt:(anIEEEFloat basicSize) put:0; yourself].
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   783
        ].
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   784
        ^ anIEEEFloat
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
   785
    ].
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   786
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   787
    nM1 := anIEEEFloat numBitsInMantissa.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   788
    nM2 := nM := self numBitsInMantissa.
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   789
    nM1 ~= nM2 ifTrue:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   790
        nM1 > nM2 ifTrue:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   791
            m2 := m2 bitShift:(nM1-nM2).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   792
            nM := nM1
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   793
        ] ifFalse:[
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   794
            m1 := m1 bitShift:(nM2-nM1).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   795
            nM := nM2
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   796
        ].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   797
    ].
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   798
5331
bd628a8e55a6 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
   799
    e1 := anIEEEFloat exponentBits - anIEEEFloat eBias.
bd628a8e55a6 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5324
diff changeset
   800
    e2 := self exponentBits - self eBias.
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   801
    e := e1.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   802
    e1 = e2 ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   803
        e1 > e2 ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   804
            m2 := m2 rightShift:(e1 - e2).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   805
            e := e1.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   806
        ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   807
            "/ e2 > e1
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   808
            m1 := m1 rightShift:(e2 - e1).
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   809
            e := e2.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   810
        ]
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   811
    ].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   812
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   813
    signBit := 0.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   814
    "/ ok, add the mantissae
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   815
    self negative ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   816
        anIEEEFloat negative ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   817
            "/ - (anIEEEFloat + self)
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   818
            m := m1 + m2.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   819
            signBit := 1.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   820
        ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   821
            "/ anIEEEFloat - self 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   822
            m := m1 - m2
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   823
        ].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   824
    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   825
        anIEEEFloat negative ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   826
            "/ self - anIEEEFloat
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   827
            m := m2 - m1.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   828
        ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   829
            "/ (anIEEEFloat + self)
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   830
            m := m1 + m2.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   831
        ].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   832
    ].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   833
    m == 0 ifTrue:[^ self class zero].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   834
    m < 0 ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   835
        m := m negated.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   836
        signBit := 1-signBit
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   837
    ].
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   838
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   839
    hi := m highBit.    
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   840
    shift := (nM + 1) - hi. 
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   841
    m := m bitShift:shift.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   842
    e := e - shift.
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   843
    m := m bitAnd:(1 bitShift:nM)-1. 
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   844
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   845
    ^ self class 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   846
        size:(self basicSize*8) exponentSize:exponentSize 
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
   847
        fraction:m exponent:(e + self eBias) signBit:signBit.
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   848
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   849
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   850
     seee eeee  eeee mmmm  mmmm mmmm  mmmm mmmm  mmmm mmmm  mmmm mmmm  mmmm mmmm  mmmm mmmm 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   851
     0100 0000  0000 0000  0000 ......                                                       2.0
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   852
     0011 1111  1111 0000  0000 ......                                                       1.0
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   853
     0400 0000  0001 0000  0000 ......                                                       4.0
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   854
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   855
     self assert:(IEEEFloat fromFloat:1.0) exponent = 1.0 exponent.  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   856
     self assert:(IEEEFloat fromFloat:1.0) mantissaBits = 1.0 mantissaBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   857
     self assert:(IEEEFloat fromFloat:1.0) eBias = 1.0 eBias.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   858
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   859
     self assert:(IEEEFloat fromFloat:2.0) exponent = 2.0 exponent.  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   860
     self assert:(IEEEFloat fromFloat:2.0) mantissaBits = 2.0 mantissaBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   861
     self assert:(IEEEFloat fromFloat:2.0) eBias = 2.0 eBias.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   862
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   863
     self assert:(IEEEFloat fromFloat:4.0) exponent = 4.0 exponent.  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   864
     self assert:(IEEEFloat fromFloat:4.0) mantissaBits = 4.0 mantissaBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   865
     self assert:(IEEEFloat fromFloat:4.0) eBias = 4.0 eBias.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   866
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   867
     self assert:(IEEEFloat fromFloat:3.0) exponent = 3.0 exponent.  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   868
     self assert:(IEEEFloat fromFloat:3.0) mantissaBits = 3.0 mantissaBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   869
     self assert:(IEEEFloat fromFloat:3.0) eBias = 3.0 eBias.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   870
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   871
     self assert:(IEEEFloat fromFloat:10.0) exponent = 10.0 exponent.  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   872
     self assert:(IEEEFloat fromFloat:10.0) mantissaBits = 10.0 mantissaBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   873
     self assert:(IEEEFloat fromFloat:10.0) eBias = 10.0 eBias.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   874
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   875
     self assert:(IEEEFloat fromFloat:1e-3) exponent = 1e-3 exponent.  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   876
     self assert:(IEEEFloat fromFloat:1e-3) mantissaBits = 1e-3 mantissaBits.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   877
     self assert:(IEEEFloat fromFloat:1e-3) eBias = 1e-3 eBias.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   878
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   879
     (IEEEFloat fromFloat:1.0) + (IEEEFloat fromFloat:1.0) = (IEEEFloat fromFloat:2.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   880
     ((IEEEFloat fromFloat:1.0) + (IEEEFloat fromFloat:1.0)) exponent = 2.0 exponent
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   881
     ((IEEEFloat fromFloat:1.0) + (IEEEFloat fromFloat:1.0)) mantissaBits = 2.0 mantissaBits
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   882
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   883
     self assert:((-4.0 asIEEEFloat) + (2.0 asIEEEFloat)) = (-2.0 asIEEEFloat)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   884
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   885
     (IEEEFloat fromFloat:2.0)
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   886
     self assert:((IEEEFloat fromFloat:2.0) + (IEEEFloat fromFloat:2.0)) = (IEEEFloat fromFloat:4.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   887
     self assert:((IEEEFloat fromFloat:4.0) + (IEEEFloat fromFloat:4.0)) = (IEEEFloat fromFloat:8.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   888
     self assert:((IEEEFloat fromFloat:0.0) + (IEEEFloat fromFloat:1.0)) = (IEEEFloat fromFloat:1.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   889
     self assert:((IEEEFloat fromFloat:1.0) + (IEEEFloat fromFloat:0.0)) = (IEEEFloat fromFloat:1.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   890
     self assert:((IEEEFloat fromFloat:1.0) + (IEEEFloat fromFloat:2.0)) = (IEEEFloat fromFloat:3.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   891
     self assert:((IEEEFloat fromFloat:100.0) + (IEEEFloat fromFloat:2.0)) = (IEEEFloat fromFloat:102.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   892
     self assert:((IEEEFloat fromFloat:2.0) + (IEEEFloat fromFloat:100.0)) = (IEEEFloat fromFloat:102.0) 
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   893
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   894
     self assert:((IEEEFloat fromFloat:4.0) + (IEEEFloat fromFloat:-2.0)) = (IEEEFloat fromFloat:2.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   895
     self assert:((IEEEFloat fromFloat:8.0) + (IEEEFloat fromFloat:-2.0)) = (IEEEFloat fromFloat:6.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   896
     self assert:((IEEEFloat fromFloat:100.0) + (IEEEFloat fromFloat:-2.0)) = (IEEEFloat fromFloat:98.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   897
     self assert:((IEEEFloat fromFloat:-2.0) + (IEEEFloat fromFloat:100.0)) = (IEEEFloat fromFloat:98.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   898
     self assert:((IEEEFloat fromFloat:-2.0) + (IEEEFloat fromFloat:-100.0)) = (IEEEFloat fromFloat:-102.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   899
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   900
     self assert:((IEEEFloat fromFloat:-0.1) + (IEEEFloat fromFloat:0.1)) = (IEEEFloat fromFloat:0.0)  
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   901
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   902
! !
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   903
5345
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   904
!IEEEFloat methodsFor:'mathematical functions'!
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   905
5364
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   906
ln
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   907
    "return the natural logarithm of myself.
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   908
     Raises an exception, if the receiver is less or equal to zero.
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   909
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   910
     Not sure if this is really faster than using a taylor right away:
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   911
     the three exp-computations at the end are done in qDouble and are tailors themself..."
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   912
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   913
    |x|
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   914
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   915
    self = self class zero ifFalse:[
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   916
        self positive ifTrue:[
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   917
            "/ initial approx.
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   918
            x := self coerce:(self asFloat ln).
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   919
            "/ three more iterations of newton...
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   920
            x := x + (self * (x negated exp)) - 1.0.
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   921
            x := x + (self * (x negated exp)) - 1.0.
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   922
            x := x + (self * (x negated exp)) - 1.0.
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   923
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   924
            ^ x
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   925
        ].
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   926
    ].
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   927
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   928
    "/ now done via trapInfinity; was:
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   929
    "/ d0 = 0.0 ifTrue:[
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   930
    "/     ^ Infinity negative
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   931
    "/ ].
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   932
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   933
    "/ if you need -INF for a zero receiver, try Number trapInfinity:[...]
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   934
    ^ self class
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   935
        raise:(self = 0 ifTrue:[#infiniteResultSignal] ifFalse:[#domainErrorSignal])
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   936
        receiver:self
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   937
        selector:#ln
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   938
        arguments:#()
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   939
        errorString:'bad receiver in ln (not strictly positive)'
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   940
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   941
    "                                 
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   942
     Number trapInfinity:[ 0.0 ln ]   
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   943
     Number trapInfinity:[ 0.0 asIEEEFloat ln ]    
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   944
     1.0 asIEEEFloat ln         
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   945
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   946
     2.7 asIEEEFloat ln
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   947
     100 asIEEEFloat ln
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   948
     3.0 asIEEEFloat ln printfPrintString:'%10.8f'
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   949
    "
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   950
!
1e9dbd3bab51 #QUALITY by exept
Claus Gittinger <cg@exept.de>
parents: 5363
diff changeset
   951
5345
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   952
log10
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   953
    "return log base-10 of the receiver.
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   954
     Raises an exception, if the receiver is less or equal to zero.
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   955
     Here, fallback to the general logarithm code."
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   956
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   957
    ^ self ln / (self coerce:Float ln10)
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   958
! !
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   959
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   960
!IEEEFloat methodsFor:'printing & storing'!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   961
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   962
printOn:aStream
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   963
    thisContext isRecursive ifTrue:[
5345
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   964
        aStream nextPutAll:'IEEEFloat (recursion error while printing)'.
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   965
        ^ self.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   966
    ].
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
   967
    "/ super printOn:aStream.
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   968
    PrintfScanf printf:'%g' on:aStream argument:self.
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   969
! !
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   970
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   971
!IEEEFloat methodsFor:'queries'!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   972
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   973
eBias
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   974
    "Answer the exponent's bias;
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   975
     that is the offset of the zero exponent when stored"
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   976
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   977
    ^ (1 bitShift:exponentSize-1) - 1
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   978
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   979
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   980
     1.0 numBitsInExponent 11
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   981
     1.0 eBias             1023
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   982
     1.0 emin              -1022
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   983
     1.0 emax              1023
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   984
     1.0 fmin              2.2250738585072E-308
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   985
     1.0 fmax              1.79769313486232E+308
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   986
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   987
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   988
5345
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   989
epsilon
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   990
    ^ self radix asFloat raisedToInteger:(1 - self precision)
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   991
!
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
   992
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   993
numBitsInExponent
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   994
    ^ exponentSize
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   995
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   996
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   997
     1.0 numBitsInExponent 11
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   998
     1.0 numBitsInMantissa 52
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
   999
     1.0 precision         53
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1000
     1.0 decimalPrecision  16
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1001
     1.0 eBias             1023
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1002
     1.0 emin              -1022
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1003
     1.0 emax              1023
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1004
     1.0 fmin              2.2250738585072E-308
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1005
     1.0 fmax              1.79769313486232E+308
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1006
    "
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1007
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1008
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1009
numBitsInMantissa
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
  1010
    "answer the number of bits in the mantissa (the significant).
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
  1011
     This is an IEEE float,
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
  1012
        where n*8 - 1 - exponentSize (n=nr of bytes)
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
  1013
     bits are available in the mantissa (the hidden bit is not counted here):
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
  1014
        s ee...ee mmm...mmm
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1015
    "
5334
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
  1016
fcba54f692d0 #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5333
diff changeset
  1017
    ^ (self basicSize * 8) - exponentSize - 1 "/ sign
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
  1018
!
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
  1019
5345
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1020
precision
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1021
    ^ self numBitsInMantissa + 1 - self numBitsInIntegerPart 
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1022
!
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1023
5342
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
  1024
radix
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
  1025
    "Answer the exponent's radix"
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
  1026
ff3fcae67b03 #REFACTORING by exept
Claus Gittinger <cg@exept.de>
parents: 5341
diff changeset
  1027
    ^ 2
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1028
! !
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1029
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1030
!IEEEFloat methodsFor:'testing'!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1031
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1032
isFinite
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1033
    "return true, if the receiver is a finite float (not NaN or +/-INF)"
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1034
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1035
   ^ self exponentBits ~= ((1 bitShift:self numBitsInExponent)-1)
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1036
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1037
    "Modified: 12.2.1997 / 16:45:27 / cg"
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1038
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1039
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1040
isInfinite
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1041
    "return true, if the receiver is an infinite float (+/-INF)"
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1042
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1043
   ^ (self exponentBits = ((1 bitShift:self numBitsInExponent)-1))
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1044
   and:[ self mantissaBits = 0 ]
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1045
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1046
    "Modified: 12.2.1997 / 16:45:27 / cg"
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1047
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1048
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1049
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1050
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1051
isNaN
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1052
    "return true, if the receiver is an invalid float (NaN - not a number)"
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1053
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1054
   ^ (self exponentBits = ((1 bitShift:self numBitsInExponent)-1))
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1055
   and:[ self mantissaBits ~= 0 ]
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1056
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1057
    "Modified: 12.2.1997 / 16:45:27 / cg"
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1058
!
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1059
5333
7e56ac13f641 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  1060
isZero
7e56ac13f641 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  1061
    "return true, if the receiver is zero"
7e56ac13f641 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  1062
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1063
    1 to:self basicSize-1 do:[:i | 
5333
7e56ac13f641 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  1064
        (self basicAt:i) ~~ 0 ifTrue:[^ false].
7e56ac13f641 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  1065
    ].
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1066
    ((self basicAt:self basicSize) bitAnd:16r7F) ~~ 0 ifTrue:[^ false].     
5333
7e56ac13f641 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  1067
    ^ true
7e56ac13f641 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  1068
5355
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1069
    "
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1070
     0.0 negated = 0.0
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1071
     0.0 negated isZero
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1072
     0.0 asIEEEFloat isZero
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1073
     0.0 asIEEEFloat negated isZero   
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1074
     0.0 asIEEEFloat = 0.0        
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1075
     0.0 asIEEEFloat negated = 0.0   
e07f5bcb8485 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5346
diff changeset
  1076
    "
5333
7e56ac13f641 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  1077
!
7e56ac13f641 #FEATURE by exept
Claus Gittinger <cg@exept.de>
parents: 5331
diff changeset
  1078
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1079
negative
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1080
    "return true if the receiver is less than zero."
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1081
5356
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1082
    |sz hi|
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1083
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1084
    sz := self basicSize.
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1085
    ((hi := self basicAt:sz) bitTest:16r80) ifTrue:[
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1086
        "/ possibly negative; but could still be a negative zero
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1087
        hi == 16r80 ifFalse:[^ true].
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1088
        1 to:sz-1 do:[:i | (self basicAt:i) == 0 ifFalse:[^ true]].
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1089
        "/ yes - it is -0.0
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1090
    ].
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1091
    ^ false
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1092
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1093
    "
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1094
     -1.0 asIEEEFloat negative  
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1095
     0.0 asIEEEFloat negative   
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1096
     -0.0 asIEEEFloat negative  
c5036483d628 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5355
diff changeset
  1097
    "
5324
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1098
! !
Claus Gittinger <cg@exept.de>
parents: 5278
diff changeset
  1099
5345
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1100
!IEEEFloat methodsFor:'truncation & rounding'!
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1101
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1102
ceilingAsFloat
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1103
    "return the smallest integer-valued float greater or equal to the receiver.
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1104
     This is much like #ceiling, but avoids a (possibly expensive) conversion
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1105
     of the result to an integer.
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1106
     It may be useful, if the result is to be further used in another float-operation."
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1107
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1108
    self halt.
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
  1109
    ^ super ceilingAsFloat.
5345
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1110
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1111
    "
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1112
     1.5 asIEEEFloat ceilingAsFloat
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
  1113
     3.0 asIEEEFloat ceilingAsFloat
5345
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1114
    "
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1115
!
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1116
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1117
fractionPart
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1118
    "extract the after-decimal fraction part.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1119
     such that (self truncated + self fractionPart) = self"
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1120
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1121
    |e eB n m nM|
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1122
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1123
    e := self exponentBits.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1124
    eB := self eBias.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1125
    e < eB ifTrue:[
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1126
        "/ integer part is zero
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1127
        ^ self
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1128
    ].
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
  1129
    nM := self numBitsInMantissa. 
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1130
    m := self mantissaBits.
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
  1131
    "/ bring in the hidden bit
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
  1132
    m := m bitOr:(1 bitShift:nM).
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
  1133
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1134
    n := e - eB + 1.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1135
    e := eB - 1.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1136
    m := (m bitShift:n) bitAnd:(1 bitShift:nM)-1.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1137
    "/ normalize
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1138
    [m highBit == nM] whileTrue:[
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1139
        m := m bitShift:1.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1140
        e := e - 1.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1141
    ].
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1142
    ^ ((self class basicNew:self basicSize) exponentSize:exponentSize)
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1143
        setFraction:m exponent:e signBit:(self negative ifTrue:[1] ifFalse:[0]).
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1144
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1145
    "
5362
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
  1146
     1.5 asIEEEFloat fractionPart
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
  1147
     1.0 asIEEEFloat fractionPart
e3b499db0368 #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5358
diff changeset
  1148
     3.0 asIEEEFloat fractionPart
5346
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1149
    "
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1150
!
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1151
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1152
truncated
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1153
    "return the receiver truncated towards zero as an integer"
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1154
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1155
    ^ super truncated.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1156
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1157
    "
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1158
     1.5 asIEEEFloat truncated
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1159
    "
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1160
!
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1161
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1162
truncatedAsFloat
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1163
    "return the receiver truncated towards zero as a float.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1164
     This is much like #truncated, but avoids a (possibly expensive) conversion
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1165
     of the result to an integer.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1166
     It may be useful, if the result is to be further used in another
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1167
     float-operation."
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1168
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1169
    ^ self - self fractionPart.
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1170
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1171
    "
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1172
     1.5  truncatedAsFloat
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1173
     1.0  truncatedAsFloat
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1174
     1.5 asIEEEFloat truncatedAsFloat
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1175
     1.0 asIEEEFloat truncatedAsFloat
fc0657f18862 #BUGFIX by cg
Claus Gittinger <cg@exept.de>
parents: 5345
diff changeset
  1176
    "
5345
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1177
! !
81044fb6e21b #FEATURE by cg
Claus Gittinger <cg@exept.de>
parents: 5342
diff changeset
  1178
5278
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1179
!IEEEFloat class methodsFor:'documentation'!
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1180
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1181
version_CVS
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1182
    ^ '$Header$'
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1183
! !
f83cbbc43aad initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
  1184