QuadFloat.st
author Claus Gittinger <cg@exept.de>
Thu, 06 Jun 2019 20:51:40 +0200
changeset 4983 696dd6d07736
child 4991 9d86d1eb2a65
permissions -rw-r--r--
initial checkin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4983
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"{ NameSpace: Smalltalk }"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
LimitedPrecisionReal variableByteSubclass:#QuadFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:''
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	classVariableNames:'QuadFloatZero QuadFloatOne Pi E Epsilon NaN PositiveInfinity
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
		NegativeInfinity Halfpi HalfpiNegative'
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
	poolDictionaries:''
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
	category:'Magnitude-Numbers'
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
!QuadFloat class methodsFor:'documentation'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
documentation
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
    QuadFloats represent rational numbers with limited precision
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    and are mapped to IEEE quadruple precision format (128bit).
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
    If the underlying cpu supports them natively, the machine format (long double) is
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
    used. Otherwise, a software emulation is done, which is much slower.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    Thus only use them, if you really need the additional precision;
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
    if not, use Float (which are doubles) or LongFloats which usually have IEEE extended precision (80bit).
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
    QuadFloats give you definite 128 bit quadruple floats,
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
    thus, code using quadFloats is guaranteed to be portable from one architecture to another.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
    Representation:
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
        gcc-sparc:
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
            128bit quadruple IEEE floats (16bytes);
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
            112 bit mantissa,
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
            16 bit exponent,
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
            34 decimal digits (approx.)
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
    Mixed mode arithmetic:
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
        quadFloat op anyFloat    -> longFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
        longFloat op complex     -> complex
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
    Range and precision of storage formats: see LimitedPrecisionReal >> documentation
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    [author:]
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
        Claus Gittinger
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    [see also:]
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
        Number
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
        Float ShortFloat LongFloat Fraction FixedPoint Integer Complex
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
        FloatArray DoubleArray
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
        https://en.wikipedia.org/wiki/Extended_precision
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
!QuadFloat class methodsFor:'instance creation'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
basicNew
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
    "return a new quadFloat - here we return 0.0
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
     - QuadFloats are usually NOT created this way ...
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
     Its implemented here to allow things like binary store & load
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
     of quadFloats.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
     (but it is not a good idea to store the bits of a float - the reader might have a
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
      totally different representation - so floats should be
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
      binary stored in a device independent format)."
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
%{  /* NOCONTEXT */
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
#ifndef __SCHTEAM__
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    OBJ newFloat;
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    if (sizeof(long double) == sizeof(quadfloat)) {
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
        __qMKLFLOAT(newFloat, 0.0);   /* OBJECT ALLOCATION */
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    } else {
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
        __qMKQFLOAT(newFloat, 0.0);   /* OBJECT ALLOCATION */
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    }
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    RETURN (newFloat);
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
#endif /* not SCHTEAM */
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
%}
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    "Created: / 06-06-2019 / 17:18:58 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
fromFloat:aFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    "return a new quadFloat, given a float value"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
%{  /* NOCONTEXT */
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
#ifndef __SCHTEAM__
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    OBJ newFloat;
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    float128 f;
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    if (__isFloatLike(aFloat)) {
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
        float f = __floatVal(aFloat);
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
        float128 qf = (LONGFLOAT)f;
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
        __qMKQFLOAT(newFloat, lf);   /* OBJECT ALLOCATION */
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
        RETURN (newFloat);
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    }
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
#endif
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
%}.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    self error:'invalid argument'
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
     QuadFloat fromFloat:123.0
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
     123.0 asQuadFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
     123 asQuadFloat
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    "Created: / 06-06-2019 / 18:01:03 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
!QuadFloat class methodsFor:'coercing & converting'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
coerce:aNumber
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    "convert the argument aNumber into an instance of the receiver's class and return it."
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
    ^ aNumber asQuadFloat.
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    "Created: / 06-06-2019 / 16:51:01 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
!QuadFloat class methodsFor:'constants'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
NaN
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
    "return a shortFloat which represents not-a-Number (i.e. an invalid number)"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
    NaN isNil ifTrue:[
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
        NaN := super NaN
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
    ].
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    ^ NaN
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
     self NaN
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
    "
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
    "Created: / 06-06-2019 / 16:56:09 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
e
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
    "return the constant e as quadFloat"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
    E isNil ifTrue:[
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
        "/ eDigits has enough digits for 128bit IEEE quads
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
        "/ do not use as a literal constant here - we cannot depend on the underlying C-compiler here...
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
        E  := self readFrom:(Number eDigits)
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
    ].
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
    ^ E
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
    "Created: / 06-06-2019 / 17:01:54 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
pi
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
    "return the constant pi as quadFloat"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
    Pi isNil ifTrue:[
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
        "/ piDigits has enough digits for 128bit IEEE quads
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
        "/ do not use as a literal constant here - we cannot depend on the underlying C-compiler here...
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
        Pi  := self readFrom:(Number piDigits)
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
    ].
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    ^ Pi
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    "Created: / 06-06-2019 / 17:09:51 / Claus Gittinger"
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
!QuadFloat class methodsFor:'documentation'!
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
version_CVS
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
    ^ '$Header$'
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
! !
696dd6d07736 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162