Announcement

Collapse

Forum Guidelines

This forum is for finished source code that is working properly. If you have questions about this or any other source code, please post it in one of the Discussion Forums, not here.
See more
See less

96-Bit Significand Arithmetic

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 96-Bit Significand Arithmetic

    In my edit of 1/28/09 I added the function Str96A() to do much the same as Str$(), added more options to String96A(), and added Tweak96A() to make small changes to the significand. Also one-step routines Subtract96A() and Divide96A() were added to simplify those calculations. My edit of 1/29/09 corrected a fatal error in the Type96 structure and simplified member names. The look forward reference capability of PBCC5 does not apply to UDT structures so Type/End Type statements must still appear before their reference. The equates and format description are also moved here to a more logical place. I also added a sub CheckOut96A() for internal use to check the output array dimensions, made a minor revision to Case 3 in the String96A(), and added missing array checks to the start of Tweak96A() and Val96A() functions. Sign96A() had a couple typos left over from when it initially only checked for equality. Some rearranging of statements was done to put the checks first. My edit of 2/5/09 corrected an error in Val96A() when evaluating denormals. Also the entire text was reread to make numerous revisions. My 2/9/09 edit modified Val96A() to allow optional use of PowerOfTen96A() funtion (included in my post of the same date). See the statements immediately after the IncludePowerSign label. Also added are PowerOfTwo96T() and PowerOfTwo96A() functions that return an integer power of two.

    Code:
    ' As used here, my "96-bit significand" format is as follows:
     
    '  Bit(s)  Meaning
     
    '     127  1 (Signature bit indicating valid format)
    ' 126-112  Flag bits (see below) and reserved _______
    '     111  1 if negative (or NaN); otherwise 0       | Equal to
    ' 110-96   Biased two's exponent (all 1's if Inf/NaN)| extended-
    '     95   Always one (MSB of significand)*          | precision
    '     --   Implicit binary point                     | (truncated)
    '  94-32   Next significant 63 bits of significand __| 80-bit format
    '  31-0    Least significant 32 bits of significand
     
    ' * Bit 95 is zero if denormal or zero as in extended-precision.
    ' Exponent bias is &H3FFF for normals (&H3FFE for denormals).
     
    ' In addition to signature, reserved, and flag bits (112-127):
    ' Zeros always have bits 0-110 reset.
    ' Denormals always have bits 95-110 reset.
    ' Infinities always have bits 0-94 reset and bits 95-110 set.
    ' NaN's always have bits 0-93 reset and bits 94-111 set.
     
    ' Flag bit positions between 112 and 127 are arbitrary.
    ' They are in separate nibbles for readability.
    ' If changed, modify in-code constants, e.g., Infinity in Factorial96A()
     
    %FlagSig96=127 ' Set if 96-bit significand format
    %FlagNaN96=124 ' Set if NaN            FFFF  C0000000 00000000
    %FlagInf96=120 ' Set if Infinity {7FFF|FFFF} 80000000 00000000
    %FlagDen96=116 ' Set if Denormal {0000|8000} binary 0xxxxxx...
    %FlagZer96=112 ' Set if Zero     {0000|8000} 00000000 00000000
    ' Following flag bits determined by extended-precision format:
    %FlagNeg96=111 ' =79+32 Set if Negative (or NaN)
    %FlagNor96= 95 ' =63+32 Set if finite normal (or infinity or NaN)
    %FlagInc96= 31 ' =-1+32 Set if round up for 64-bit significand
     
    ' UDT below required if using the 96T style.
    ' Recommended for arrays of 96-bit significand values.
    Type Type96 Dword
        L As Long ' Can use to load a long integer value
        X As Ext  ' Can use to load an extended-precision value
        F As Word ' Flags and reserved bits
    End Type
    This suite of functions has passed all my tests. But this must be considered as a work in progress and is subject to revision. The various blocks of code should be combined and put in an include file; I have separated them here so they can be more easily viewed. If required, e.g. in PBCC4, either add Delare statements or rearrange.

    I had been posting some notes I have made on various PowerBASIC functions on the PB Console Compiler forum more or less as an academic exercise. To have baseline data with which to work, I needed arrays of a data that represented the most accurate extended-precision representations of numbers, rather like an enhanced Val() function. To do this initially I wrote a routine that doubled or halved a string of decimal digits to convert them to binary and then put that into the extended-precision format. Without any restriction on string length, this made the process very slow. The original strings would come from web, the Microsoft calculator included in Windows, or from an
    expression such as "1E"+Format$(n). While preparing a post on the Exp() function, I recognized that a routine to multiply floating point numbers would be needed, and that is how these functions were conceived.

    One of the posts mentioned above provides information on the 80-bit extended precision format. These functions use an enhanced version of that format called by Intel double extended-precision. This enhanced format adds (on the low-memory end) 32 bits to the 64-bit significand and adds (on the high-memory end) 16 bits to the 16-bit sign/exponent. The 96-bit significand (hence "96" in the naming) is equivalent to
    almost 29 significant decimal digits. The 32 bits add ample extra precision to avoid accumulation of rounding errors and the other 16 bits contain a few flags to simplify the detection of zero, infinity and denormals. Denormals are those numbers very near zero that have reduced precision and use, depending on how one interprets it, either
    an exponent bias of &H3FFE instead of the standard &H3FFF or else an implied binary point one bit further into the significand. Denormals have very limited support in PowerBASIC (they are, for example, printed as zero) but can be created and manipulated in the Floating Point Unit (FPU) that does extended-precision arithmetic.

    This gives a total size of 128 bits (16 bytes) to this enhanced format with a 96-bit significand. All the original development of the functions was done dividing these 16 bytes into arrays of four double words dimensioned 0 to 3. The functions that use these arrays have "96A" as a suffix to their names. One can equally well use a user-defined type (UDT) and a Type structure and a set of functions with suffix "96T" are given below. Also provided are the flag locations in equate statements. There flag locations in bits 112 to 127 can be changed to others at will; those below 112 are tied to the
    extended-precision format. The Type structure and equate definitions must precede their actual usage. The code was written for PowerBASIC Console Compiler (PBCC) Version 5.01. The functions should work with earlier PBCC versions with Declare statements or rearranging. The functions should also work with PBWin and, with a few modifications, with PBDOS. The range of available options can be seen by scanning the "96T" functions below.

    Arguments may be repeated. I.e.:
    Add96A(a(), a(), a()) doubles and Multiply96A(a(), a(), a()) squares
    so reset output arrays before reuse. Output arrays have their bounds checked by CheckOut(). Input arrays pass through Create96A() and can have the forms:

    (a(3),a(2),a(1),a(0)) in 96-bit significand format
    a(3)=a(2)=a(1)=0 with a(0) in long integer format
    Hi(a(3))=0 with (Lo(a(3)),a(2),a(1)) in extended format (a(0) is ignored)

    Most functions return the rounded extended-precision value. Functions using double word arrays have suffix "96A"; those using Type96 UDT's have suffix "96T".

    Code:
    ' General conversion and tweaking significand:
     
    Function Convert96T(a As Type96, Opt s As String) As Ext
        ' Convert in-situ extended-precision or long-integer or string.
        ' This does not have to be called as is done internally.
        Dim a96(3) As Dword At VarPtr(a)
        Function=Convert96A(a96(), s)
    End Function
     
    Function PowerOfTwo96T(y As Type96, n As Long) As Ext
        ' y=2^n Integer power of two
        Dim y96(3) As Dword At VarPtr(y)
        Function=PowerOfTwo96A(y96(), n)
    End Function
    
    Function Str96T(a As Type96, n As Long) As String
        ' Output=Str$(a,n) (n<=29).
        Dim a96(3) As Dword At VarPtr(a)
        Function=Str96A(a96(), n)
    End Function
     
    Function String96T(a As Type96, Opt o As Long) As String
        ' Convert a to string depending on option code.
        Dim a96(3) As Dword At VarPtr(a)
        Function=String96A(a96(), o)
    End Function
     
    Function Tweak96T(a As Type96, n As Quad) As Ext
        ' Significand(a)=Significand(a)+n in-situ
        Dim a96(3) As Dword At VarPtr(a)
        Function=Tweak96A(a96(), n)
    End Function
     
    Function Val96T(y As Type96, s As String) As Ext
        ' y=Val(s) Convert from string
        Dim y96(3) As Dword At VarPtr(y)
        Function=Val96A(y96(), s)
    End Function
     
    ' Arithmetic functions:
    ' Absolute, Add, Copy, Multiply, Negative, Power, Reciprocal, Sign, and SquareRoot.
    ' Results appear as first argument and extended-precision value as function return.
    ' The exception is Sign with a long-integer result as the function return value.
     
    Function Absolute96T(y As Type96, a As Type96) As Ext
        ' y=Abs(a)
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Function=Absolute96A(y96(), a96())
    End Function
     
    Function Add96T(y As Type96, a As Type96, b As Type96) As Ext
        ' y=a+b
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Dim b96(3) As Dword At VarPtr(b)
        Function=Add96A(y96(), a96(), b96())
    End Function
     
    Function Copy96T(y As Type96, a As Type96) As Ext
        ' y=a
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Function=Copy96A(y96(), a96())
    End Function
     
    Function Divide96T(y As Type96, a As Type96, b As Type96) As Ext
        ' y=a/b
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Dim b96(3) As Dword At VarPtr(b)
        Function=Divide96A(y96(), a96(), b96())
    End Function
     
    Function Multiply96T(y As Type96, a As Type96, b As Type96) As Ext
        ' y=a*b
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Dim b96(3) As Dword At VarPtr(b)
        Function=Multiply96A(y96(), a96(), b96())
    End Function
     
    Function Negative96T(y As Type96, a As Type96) As Ext
        ' y=-a
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Function=Negative96A(y96(), a96())
    End Function
     
    Function Power96T(y As Type96, a As Type96, n As Long) As Ext
        ' y=a^n (n must be an integer)
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Function=Power96A(y96(), a96(), n)
    End Function
     
    Function Reciprocal96T(y As Type96, a As Type96) As Ext
        ' y=1/a
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Function=Reciprocal96A(y96(), a96())
    End Function
     
    Function Sign96T(a As Type96, Opt b As Type96) As Long
        ' y=Sgn(a-b) (y=Sgn(a) if b is not passed)
        Dim a96(3) As Dword At VarPtr(a)
        If VarPtr(b) Then
            ' b was passed y=Sgn(a-b)
            Dim b96(3) As Dword At VarPtr(b)
            Function=sign96A(a96(), b96())
        Else
            ' b was not passed y=Sgn(a)
            Function=Sign96A(a96())
        End If
    End Function
     
    Function SquareRoot96T(y As Type96, a As Type96) As Ext
        ' y=Sqr(Abs(a))*Sgn(a) (Note treatment for x<0)
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Function=SquareRoot96A(y96(), a96())
    End Function
     
    Function Subtract96T(y As Type96, a As Type96, b As Type96) As Ext
        ' y=a-b
        Dim y96(3) As Dword At VarPtr(y)
        Dim a96(3) As Dword At VarPtr(a)
        Dim b96(3) As Dword At VarPtr(b)
        Function=Subtract96A(y96(), a96(), b96())
    End Function
    For the rest of the description, the use of the double word array format will be assumed and, other than the equates, none of the above code is needed. There are four ways to input data into a form that can be used, and the function Convert96A() is a general purpose routine to do that with numbers. Convert96A() has the additional capability of converting an optional string using the Val96A() function. Like almost all functions Convert96A() also returns the rounded best extended-precision value corresponding to the array. These routines normally follow PowerBASIC usage of bankers rounding and may decrement the 96-bit significand insignificantly to simplify rounding. Elements are called 0 to 3. The four ways are:

    1. Use the optional string to input a positive or negative decimal value as one would with Val() except that spaces and commas are removed automatically. Like Val(), the characters E, e, D, d introduce a power of ten but will degrade accuracy but will be faster than a longer string.
    2. Load the array with a valid 96-bit significand value with correct flags. Incorrect flag assignment will result in a warning, and, if the array is located in protected memory, a General Protection Fault will result.
    3. Reset the array and load element 0 with a long integer value. The following will work correctly even if MyLong& is negative: MyArray???(0)=MyLong&
    4. Zero element 3 (clearing flag bits) and then load the array beginning with element 1 with an extended-precision value. Element 0 will be ignored and zeroed automatically. This can be done by direct addressing and a statement pair:
    Dim MyExt(0) As Ext At VarPtr(MyArray(1))
    MyArray(3)=0: MyExt(0)=ExtVariable##

    Obviously, if ways 2, 3 or 4 are used, the string input must be omitted or null. A value of +zero would be loaded identically by either 3 or 4 with a reset array. For output, like almost all the functions, Convert96A() also returns a rounded extended-precision value. Other functions doing I/O are String96A() and Val96A(). There is also the function String96A() that can be easily expanded to put the output into different string formats. The function Val96A() does the string conversion. PowerOfTwo96A() returns an integer power of two. Prior to PBCC5 with its ability to resolve forward references, these, like almost all these functions, need Declare statements.

    Code:
    Function Convert96A(a() As Dword, _ ' Input array
         Opt s As String) As Ext        ' Input string does Val96A()
        ' Called with all input arrays at start of functions.
        ' Called with output array at end of functions.
        ' Convert in-situ extended-precision in (a(3),a(2),a(1)) or
        '     long integer in a(0) to 96-bit significand format.
        ' Also checks bounds of input arrays.
        ' Second parameter (IncrSig) intended for internal use.
        '
        ' Methodology:
        ' If s is provided, immediately calls Val96A() to convert it.
        ' Otherwise, a() is checked for following possibilities in this order:
        ' 1. If already has 96-bit significand signature bit set:
        '     a. Set flag bits as required
        '     b. If %FlagInc96 is set round up copy of a()
        '     c. Return rounded extended-precision value and exit
        ' 2. If a(3)=a(2)=a(1)=0 (includes extended of value +zero):
        '     a. Treat a(0) as long integer value
        '     b. Set signature bit
        '     c. Set %FlagZer96 if zero
        '     d. Zero a(0) (no rounding required or possible)
        '     e. Return extended-precision value and exit
        ' 3. Otherwise
        '     a. Treat (Lo(a(3)),a(2),a(1)) as extended-precision value
        '     b. Set signature bit
        '     c. Set any flag bits required
        '     d. Zero a(0) (no rounding required or possible)
        '     e. Return extended-precision value and exit
        '
        Call CheckOut96A(a())
        Local i As Long
        Local sg As Long ' Sign
        Dim wa(7) As Word At VarPtr(a(0)) ' w(7)=flags; w(6)=sign & exponent
        Dim la(0) As Long At VarPtr(a(0))
        Dim aa(0) As Ext At VarPtr(a(1))
        Dim b(3) As Dword ' Working copy used if signature flag set
        Dim wb(7) As Word At VarPtr(b(0)) ' wb(7)=flags; wb(6)=sign/exp.
        Dim bb(0) As Ext At VarPtr(b(1))
        Dim q64(0) As Quad At VarPtr(b(1)) ' Extended significand
        Dim w64(0) As Word At VarPtr(b(3)) ' Extended sign/exponent
        '
        ' Check if string input and use Val96A()
        If s<>"" Then
            Call Val96A(a(), s)
            If Bit(a(0),%FlagSig96)=0 Then ?"Error Val return": WaitKey$
        End If
        '
        ' 1. Check if already in 96-bit significand format.
        ' Since a() may be in protected memory, work on a copy.
        If Bit(a(0),%FlagSig96) Then
            ' General protection error will occur if
            '     a() in protected momory and flags set incorrectly.
            ' Make a working copy in unprotected memory.
            For i=0 To 3: b(i)=a(i): Next i ' Copy96A() calls Convert96A()
            If wb(6)=&HFFFF?? And wb(5)=>&HC000?? Then ' NaN
                Reset b()
                Bit Set b(0),%FlagSig96
                Bit Set b(0),%FlagNaN96
                For i=%FlagNor96-1 To %FlagNeg96: Bit Set b(0),i: Next i
                Function=(0##/0##) ' All NaN's have sign bit set
                GoSub CheckFlags
                Exit Function
            End If
            If Bit(b(0),%FlagNeg96) Then sg=-1 Else sg=+1
            b(3)=b(3) And &H00007FFF??? ' Clear flags and sign
            If b(2)=0 And b(1)=0 And b(0)=0 Then
                If b(3)<>0 Then ?"Error zero significand":WaitKey$
                Reset b()
                Bit Set b(0),%FlagSig96
                Bit Set b(0),%FlagZer96
                If sg=-1 Then Bit Set b(0),%FlagNeg96
                Function=sg*0##
                GoSub CheckFlags
                Exit Function
            End If
            If b(3)=&H00007FFF??? Then
                Reset b()
                Bit Set b(0),%FlagSig96
                Bit Set b(0),%FlagInf96
                If sg=-1 Then Bit Set b(0),%FlagNeg96
                For i=%FlagNor96 To %FlagNeg96-1: Bit Set b(0),i: Next i
                Function=sg/0##
                GoSub CheckFlags
                Exit Function
            End If
            Bit Set b(0),%FlagSig96
            If sg=-1 Then Bit Set b(0),%FlagNeg96
            If Bit(b(0),%FlagNor96)=0 Then Bit Set b(0),%FlagDen96
            Call BankersRounding96A(b())
            GoSub CheckFlags
            ' Use the working copy as scratch for rounding return value.
            If Bit(b(0),%FlagInc96) Then
                b(0)=&HFFFFFFFF??? ' Forces rounding of 64-bit significand
                Call RoundUp96A(b())
            End If
            Function=bb(0) ' Altered b() is not a part of a()
            Exit Function
            CheckFlags: ' Check if flags correct:
                i=0
                If a(0)<>b(0) Or a(1)<>b(1) Or a(2)<>b(2) Then
                    Incr i
                    ? "Warning significands don't match":WaitKey$
                End If
                If Lo(Word,a(3))<>Lo(Word,a(3)) Then
                    Incr i
                    ? "Warning sign/exponents don't match":WaitKey$
                End If
                If Hi(Word,a(3))<>Hi(Word,a(3)) Then
                    Incr i
                    ? "Warning flags don't match":WaitKey$
                End If
                If i Then
                    For i=0 To 3: a(i)=b(i): Next i
                End If
            Return
        End If
        '
        ' 2. Check if long integer in a(0) (or +zero extended-precision).
        If a(3)=0 And a(2)=0 And a(1)=0 Then
            Bit Set a(0),%FlagSig96
            Function=la(0)
            Select Case a(0)
            Case &H00000000& ' +Zero
                Bit Set a(0),%FlagZer96 ' Zero
                Exit Function
            Case &H80000000& ' -2^31 (cannot simply negate)
                wa(6)=&HC01E??: Swap a(2),a(0) ' So significand OK
                Function=-2^31
                Exit Function
            End Select
            wa(6)=&H401E?? ' &H3FFF+31=&H401E
            If Bit(a(0),%FlagInc96) Then ' Bit 31 set if negative long
                Bit Set a(0),%FlagNeg96: la(0)=-la(0)
            End If
            Do ' As Bit(a(0),%FlagInc96)=0, do loop done at least once.
                Shift Left a(0),1
                Decr wa(6)
            Loop Until Bit(a(0),%FlagInc96) ' %FlagInc96-31
            Swap a(2),a(0) ' Significand has MSB set and a(0)=0
            Exit Function
        End If
        '
        ' 3. Must be extended-precision (other than +zero).
        wa(7)=0: a(0)=0 ' Clear flags and a(0)
        Bit Set a(0),%FlagSig96
        If wa(6)=&H8000?? And a(2)=0 And a(1)=0 Then
            Bit Set a(0),%FlagZer96 ' -Zero
        ElseIf a(2)=&H800000000??? And a(1)=0 Then
            Select Case wa(6)
            Case &H7FFF??,&HFFFF??: Bit Set a(0),%FlagInf96 ' Infinity
            End Select
        ElseIf Bit(a(0),%FlagNor96)=0 Then
            Bit Set a(0),%FlagDen96 ' Denormal
        ElseIf wa(6)=&HFFFF?? And wa(5)=>&HC000?? Then
            wa(5)=&HC000??: Bit Set a(0),%FlagNaN96 ' NaN
            For i=0 To 4: wa(i)=0: Next i
        End If
        Function=aa(0)
        Exit Function
    End Function
     
    Function PowerOfTwo96A(y() As Dword, _ ' Output array
        n As Long) As Ext                  ' Input integer power of two
        ' y <-- 2^n
        Call CheckOut96A(y())
        Local i As Long
        Reset y()
        Bit Set y(0),%FlagSig96
        Select Case n
        Case <-16477 ' Zero
            Bit Set y(0),%FlagZer96
        Case -16477 To -16383 ' Denormal
            ' -16477 To -16446 are zero in extended-precision
            Bit Set y(0),%FlagDen96
            Bit Set y(0),n+16477 ' 16477=16382+95
        Case -16382 To 16383 ' Normal
            y(3)=y(3)+&H00003FFF???+n
            Bit Set y(0),%FlagNor96
        Case >16383 ' Infinity
            Bit Set y(0),%FlagInf96
            For i=%FlagNor96 To %FlagNeg96-1: Bit Set y(0),i: Next i
        End Select
        Function=Convert96A(y())
    End Function
     
    Function Str96A(a() As Dword, _ ' Input array
        ByVal n As Long) As String  ' Input length (29 max)
        ' Output <-- Str$(a,n) Convert to n-digit string (n<=29).
        ' The 29th digit is subject to error as 2^95=0.396E29<1E29.
        ' If n<=0 then defaults to 29.
        ' Methodology: Use Str$() and Val96A() to get correction term.
        Call Convert96A(a())
        Local a0,i,j,k As Long: a0=Asc("0")
        Dim d(3) As Dword ' |a()|, possibly biased by 1E64
        Dim t(3) As Dword ' Temporary array
        Dim s(2) As String ' String components of result
        Dim e(2) As Long ' ...E... exponent
        If Bit(a(0),%FlagNaN96) Then Function="Not-a-Number":Exit Function
        If Bit(a(0),%FlagInf96) Then
            i=Bit(a(0),%FlagNeg96)
            If i Then Function="-Infinity" Else Function="+Infinity"
            Exit Function
        End If
        If Bit(a(0),%FlagZer96) Then
            If Bit(a(0),%FlagNeg96) Then Function="-0" Else Function=" 0"
            Exit Function
        End If
        If n<=0 Or n>29 Then n=29
        If Bit(a(0),%FlagDen96) Then
            t(0)=10
            Call Power96A(t(), t(),64) ' 10^64
            Call Multiply96A(t(), a(),t()) ' Bias by 10^64
            s(0)=Trim$(Str$(Absolute96A(d(), t()),18))
        Else
            s(0)=Trim$(Str$(Absolute96A(d(), a()),18))
        End If
        Call Val96A(t(), s(0))
        Call Subtract96A(d(), d(),t()) ' d() = correction to |a()|
        s(1)=Trim$(Str$(Absolute96A(t(), d()),18))
        ' d() retains sign of correction term
        For i=0 To 1
            If InStr(s(i),".") Then
                If InStr(s(i),"E")=0 Then s(i)=s(i)+"E0"
            ElseIf InStr(s(i),"E") Then
                Replace "E" With ".E" In s(i)
            Else
                s(i)=s(i)+".E0"
            End If
            j=InStr(s(i),"E")
            e(i)=Val(Mid$(s(i),j+1))
            If Bit(a(0),%FlagDen96) Then e(i)=e(i)-64
            s(i)=Left$(s(i),j-1)
            e(i)=e(i)+InStr(s(i),".")-2 ' Convert to x.xxxxx...
            Replace "." With "" In s(i)
        Next i
        If e(1)=>e(0) Then ? "Error exponent":WaitKey$
        s(1)=String$(e(0)-e(1),"0")+s(1)
        e(1)=e(0): e(2)=e(0)
        k=Max&(Len(s(0)),Len(s(1)))
        s(0)=s(0)+String$(k-Len(s(0)),"0")
        s(1)=s(1)+String$(k-Len(s(1)),"0")
        If Bit(d(0),%FlagNeg96) Then
            j=0
            For i=k To 1 Step -1
                j=Asc(s(0),i)-Asc(s(1),i)-j
                If j<0 Then
                    s(2)=Chr$(j+10+a0)+s(2):j=1
                Else
                    s(2)=Chr$(j+a0)+s(2):j=0
                End If
            Next i
            If Trim$(s(2),"0")="" Then Function=" 0": Exit Function
            Do While Asc(s(2))=a0
                s(2)=Mid$(s(2),2)
                Decr e(2)
            Loop
        Else
            j=0
            For i=k To 1 Step -1
                j=Asc(s(0),i)-a0+Asc(s(1),i)-a0+j
                s(2)=Chr$((j Mod 10)+a0)+s(2)
                j=j\10
            Next i
            If j Then s(2)="1"+s(2): Incr e(2)
        End If
        s(2)=RTrim$(s(2),"0")
        Select Case Len(s(2))
        Case <=n: s(2)=s(2)+String$(n-Len(s(2)),a0):j=0
        Case Else
            Select Case Asc(s(2),n+1)-a0
            Case 0 To 4: j=0
            Case 5
                Select Case Asc(s(2),n)-a0
                Case 0,2,4,6,8: j=Min&(1,Len(s(2))-(n+1))
                Case 1,3,5,7,9: j=1
                End Select
            Case 6 To 9: j=1
            End Select
            s(2)=Left$(s(2),n)
        End Select
        Do While j
            For i=n To 1 Step -1
                j=Asc(s(2),i)-a0+j
                Asc(s(2),i)=(j Mod 10)+a0
                j=j\10
            Next i
            If j Then
                s(2)="1"+s(2): Incr e(2)
                Select Case Asc(s(2),-1)-a0
                Case 0 To 5:j=0
                Case 6 To 9:j=1
                End Select
                s(2)=Left$(s(2),n)
            Else
                j=0
            End If
        Loop
        If Len(s(2))>n+1 Then j=Asc(s(2),n+1)=>a0+5:s(2)=Left$(s(2),n)
        If Bit(a(0),%FlagNeg96) Then s(2)="-"+s(2) Else s(2)=" "+s(2)
        Function=Left$(s(2),2)+"."+Mid$(s(2),3)+"E"+Format$(e(2))
    End Function
     
    Function String96A(a() As Dword, _   ' Input array
        Opt ByVal o As Long) _           ' Input optional action to be taken
        As String                        ' String output depending on option o
        ' o<0 adds a $CrLf prefix for Clipboard statements
        ' This function is subject to expansion and modification so output:
        '     Generally used with Print for testing results, and
        '     For inbedded constants (e.g. see the factorial post).
        Local x As Ext
        x=Convert86A(a())
        Local i As Long
        Local d As Dword
        Local s As String
        Local t As String
        Dim b(3) As Dword
        Dim c(3) As Dword
        Dim ic(0) As Long At VarPtr(c(0))
        Dim wx(5) As Word At VarPtr(x)
        If Bit(a(0),%FlagNaN96) Then ? "Warning NaN":WaitKey$
        ' Clipboard needs $CrLf between lines.
        If o<0 Then o=Abs(o):s=$CrLf
        Select Case o
        Case 0
            ' Each DWord in hex format separated by space
            ' Full 29-digit decimal value appended
            For i=3 To 0 Step -1: s=s+Hex$(a(i),8)+$Spc: Next i
            s=s+"="+$Spc+Str96A(a(),29)
        Case 1
            ' Suitable string to put 80 bits on Clipboard (PBCC5+)
            s=s+"    !dw " ' Clipboard needs $CrLf between lines.
            For i=0 To 4
                s=s+"&H"+Hex$(wx(i),4)+Choose$(i+1,",",",",",",", ","")
            Next i
        Case 2
            ' Suitable string to put 128-bits on Clipboard (PBCC5+)
            s=s+"!dd "
            For i=0 To 3
                s=s+"&H"+Hex$(a(i),8)+Choose$(i+1,", ",",",", ","")
            Next i
        Case 3
            ' Str96A(...,29) with space separators
            t=Str96A(a(),29) ' String to avoid conflict with o=-3
            i=InStr(t,".")
            s=s+Left$(t,i+5)+ _
                $Spc+Mid$(t,i+06,5)+$Spc+Mid$(t,i+11,5)+ _
                $Spc+Mid$(t,i+16,5)+$Spc+Mid$(t,i+21,5)+ _
                $Spc+Mid$(t,i+26,3)+$Spc+Mid$(t,i+29)
        Case 8
            ' Octal output for comparing with Donald E. Knuth's
            ' "The Art of Computer Programming" (any vol.) appendix
            ' This was written for values near 1.0 -- modify if testing others.
            If Bit(a(0),%FlagNeg96) Then s="-" Else s=""
            Call Absolute96A(b(),a())
            x=Abs(x)
            If x=>Exp2(31) Then ? "Error Too large"
            ic(0)=Fix(x)
            s=s+Oct$(ic(0))+"."
            Decr ic(0)
            Call Subtract96A(b(), b(),c()) ' 1<b<2
            If b(3)<>&H80003FFF??? Then ? "Error in octal":WaitKey$
            For i=92 To 2 Step -3
                s=s+Oct$(4*Bit(b(0),i+2)+2*Bit(b(0),i+1)+Bit(b(0),i))
                If (i Mod 15)=5 Then s=s+$Spc
            Next i
            s=s+Oct$(4*Bit(b(0),1)+2*Bit(b(0),0))
        Case Else: ?"Error Unsupported option ";o:WaitKey$
        End Select
        Function=s
    End Function
     
    Function Tweak96A(a() As Dword, _ ' Input array
        ByVal n As Quad) As Ext _     ' Input tweak
        ' Significand(a) <-- Significand(a)+n in-situ
        ' Will not tweak NaN, Infinity, or Zero.
        Call Convert96A(a())
        Local i As Long
        Dim q(0) As Quad At VarPtr(a(0))
        If n=0 Then Function=Convert96A(a()): Exit Function
        If Bit(a(0),%FlagNaN96) Then ? "Warning Tweak NaN";:n=0
        If Bit(a(0),%FlagInf96) Then ? "Warning Tweak Infinity";:n=0
        If Bit(a(0),%FlagZer96) Then ? "Warning Tweak Zero";:n=0
        If Bit(a(0),%FlagDen96) And a(2)=0 And q(0)+n=0 Then
            ? "Warning Tweak denormal to zero";:n=0
        End If
        If q(0)<0 Xor q(0)+n<0 Then ? "Warning Tweak negative quad";:n=0
        If n=0 Then ? " cannot be done":WaitKey$
        q(0)=q(0)+n
        Function=Convert96A(a())
    End Function
     
    Function Val96A(y() As Dword, _ ' Output array
        ByVal s As String) As Ext   ' Input string
        ' Converts decimal string to 96-bit significand array
        ' Change numeric string to a()
        ' Allowed characters:
        '     Commas and spaces (removed at start)
        '     Initial "-" (also after E)
        '     One decimal point and one E (or e,D,d)
        '     Digits (0123456789)
        ' Most accurate if E avoided, but if s is very long will be slow.
        '
        ' Methodology for decimal significand:
        '     1. If 1.0 <= |value| < 2.0 goto 4
        '     2. Halve or double value changing exponent
        '     3. Goto 1
        '     4. If |value| => 1.0 then
        '         4a. value <-- value - 1
        '         4b. Set significand bit
        '     5. Double |value| and move bit pointer towards LSB
        '     6. While bit pointer within significand goto 4
        '     7. Round final value
        '
        Call CheckOut96A(y())
        Local i,j As Long
        Local e As Long ' Decimal exponent
        Local n As Long ' -1 if negative, else 0
        Local dp As Long ' Decimal point is just before this character
        Local bn As Long ' Bit number to set
        Local t As String ' Temporary string
        Dim b(0) As Integer At VarPtr(y(3)) ' Binary exponent
        Dim p(3) As Dword ' Power-of-ten factor
        Reset y()
        Bit Set y(0),%FlagSig96
        s=Remove$(s, Any " ,+")
        i=InStr(s, Any "EeDd")
        If i Then
            e=Val(Mid$(s,i+1)) ' If i=0, e=0
            s=Left$(s,i-1)
        End If
        n=(Asc(s)=Asc("-")): If n Then s=Mid$(s,2)
        If InStr(s,".")=0 Then s=s+"."
        If Tally(s,".")<>1 Then ? "Error multiple decimals":WaitKey$
        s=Trim$(s,"0")
        If Remove$(s, Any "01234456789.")<>"" Then
            ? "Error character(s) ";Remove$(s,Any"01234456789."):WaitKey$
        End If
        If s="." Then ' Zero
            Bit Set y(0),%FlagZer96
            If n Then Bit Set y(0),%FlagNeg96
            Function=Convert96A(y())
            Exit Function ' Power makes no difference
        End If
        ' Initial values:
        b(0)=&H3FFF%: bn=3*32-1: dp=InStr(s,".")
        s=Remove$(s,".")
        If dp<>1 Then
            ' Halve until <2.0
            Do Until dp=2 And Asc(s)=Asc("1")
                j=0
                For i=1 To Len(s)
                    j=Asc(s,i)-Asc("0")+10*j
                    Mid$(s,i,1)=Chr$(j\2+Asc("0"))
                    j=Bit(j,0)
                Next i
                Incr b(0)
                If b(0)=&H7FFF% Then
                    ? "Warning: Decimal significand too long":WaitKey$
                    Reset y()
                    Bit Set y(0),%FlagSig96
                    Bit Set y(0),%FlagInf96
                    For i=%FlagNor96 To %FlagNeg96-1:Bit Set y(0),i:Next i
                    GoTo IncludePowerSign
                End If
                If j Then s=s+"5"
                j=Len(s): s=LTrim$(s,"0"): dp=dp-(j-Len(s))
                s=RTrim$(s,"0")
                If Len(s)<dp Then s=s+String$(dp-Len(s),"0")
            Loop
        Else
            ' Double until =>1.0
            Do Until dp=2 And Asc(s)=Asc("1")
                Decr b(0)
                If b(0)=&H0000% Then
                    Bit Set y(0),%FlagDen96
                    Exit Do
                End If
                GoSub DoubleString
            Loop
        End If
        ' Create significand
        Do
            If dp=2 And Asc(s)=Asc("1") Then
                If bn=>0 Then
                    Bit Set y(0),bn
                    Mid$(s,1,1)="0"
                Else
                    Call RoundUp96A(y())
                    Exit Do
                End If
            End If
            If bn<0 Then Exit Do
            If Trim$(s,"0")="" Then
                Call BankersRounding96A(y())
                Exit Do
            End If
            Decr bn
            GoSub DoubleString
        Loop
    IncludePowerSign:
        #If -1 ' Use True (-1) if PowerOfTen96A() exists, else use 0.
            ' More accurate, but PowerOfTen96A() is almost 600KB.
            Call PowerOfTen96A(p(),e)
            Call Multiply96A(y(), y(),p())
        #Else
            ' Less accurate but shorter.
            ' Using 5 instead of 10 avoids denormals in Power96A().
            p(0)=5: Call Power96A(p(), p(),e)
            Call Multiply96A(y(), y(),p())
            b(0)=b(0)+e
        #EndIf
        Select Case b(0)
        Case =>&H7FFF
            ' Infinity
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagInf96
            For i=%FlagNor96 To %FlagNeg96-1:Bit Set y(0),i:Next i
        Case <=0
            ' Denormal
            Do While b(0)
                Shift Right y(0),1
                If Bit(y(1),0) Then Bit Set y(0),31
                Shift Right y(1),1
                If Bit(y(2),0) Then Bit Set y(1),31
                Shift Right y(2),1
                Incr b(0)
            Loop
            If y(0)=0 And y(1)=0 And y(2)=0 Then
                Bit Set y(0),%FlagZer96
            Else
                Bit Set y(0),%FlagDen96
            End If
        End Select
        If n Then Bit Set y(0),%FlagNeg96
        Function=Convert96A(y())
        Exit Function
    DoubleString:
        ' GoSub routine called when decrementing b(0) or bn
        j=0
        For i=Len(s) To 1 Step -1
            j=2*(Asc(s,i)-Asc("0"))+j
            Mid$(s,i,1)=Chr$((j Mod 10)+Asc("0"))
            j=j\10
        Next i
        If j Then
            s="1"+s
            Incr dp
        End If
        s=RTrim$(s,"0")
        If Len(s)<dp Then s=s+String$(dp-Len(s),"0")
        Return
    End Function
    The next functions deal with addition and multiplication on which many of the other functions rely. They are appropriately named Add96A() and Multiply96A(). Each has two input arrays as the last two parameters and an output array, any or all of which can be the same array. As multiplying two 96-bit significands requires up to 192 bits for the
    product, an intermediate array of 24 bytes is used for each function. The addition function aligns the terms by shifting bits and adding (with the appropriate sign) the smaller to the larger using a quad array to hold the sum. The multiplication methodology is standard elementary school long multiplication of double words. It should be noted that as there is no quad-word datatype in PowerBASIC, multiplying two double words is best done in assembly using the opcode for unsigned multiply, the EDA:EAX register pair, and then adding the high and low double words to the appropriate quad array element.

    Code:
    Function Add96A(y() As Dword, _        ' Output array
        a() As Dword, b() As Dword) As Ext ' Input arrays
    ' y() <-- a() + b()
    ' Precede with Negative96A() to subtract.
    ' a(), b(), and y() are DWord arrays dimensioned (0:3).
    ' a() and/or b() can be in extended-precision or long format as, e.g.:
    '     Dim aa(0) As Ext At VarPtr(a(1)):aa(0)=xxx## or a(0)=xxx&
    ' For compatability with Finish96A() (called by Multiply96A()),
    '     a working DWord array dimensioned (0:5) is used.
    ' Methodology: shift to align and add.
    '
        Call CheckOut96A(y())
        Call Convert96A(a()): Call Convert96A(b())
        Local i,j As Long
        Local xbd As Long ' True (-1) if excess bits discarded
        Local x As Ext
        Dim aa(0) As Ext At VarPtr(a(1)) ' Extended approximation
        Dim bb(0) As Ext At VarPtr(b(1)) ' Extended approximation
        Dim mn(3) As Dword: Dim mx(3) As Dword ' Min and max abs values
        Dim eab(1) As Long ' Exponents of a() and b()
        Dim sab(1) As Long ' Signs of a() and b()
        Dim ab(5,1) As Dword ' Matrix of a() & b() extended significands
        Dim ab3(1) As Dword ' a(3) and b(3) in array format
        Dim q(5) As Quad ' q(5) = temporary significand array (quad)
        ' Check if NaN
        If  Bit(a(0),%FlagNaN96)                   Or _
            Bit(b(0),%FlagNaN96)                   Or _
               (Bit(a(0),%FlagInf96)          And _
                Bit(b(0),%FlagInf96)          And _
                   (Bit(a(0),%FlagNeg96) Xor _
                    Bit(b(0),%FlagNeg96)    )    ) Then
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagNaN96
            For i=%FlagNor96-1 To %FlagNeg96: Bit Set y(0),i: Next i ' NaN
            Function=Convert96A(y())
            Exit Function
        End If
        ' Check if |a()|=|b()|
        If IsFalse((a(3) Xor b(3)) And &H00007FFF???) And _
            a(2)=b(2) And a(1)=b(1) And a(0)=b(0) Then
            If Bit(a(0),%FlagZer96) And Bit(b(0),%FlagZer96) Then
                Reset y()
                Bit Set y(0),%FlagSig96
                Bit Set y(0),%FlagZer96
                If Bit(a(0),%FlagNeg96) And Bit(b(0),%FlagNeg96) Then
                    Bit Set y(0),%FlagNeg96
                End If
            ElseIf Bit(a(0),%FlagNeg96) Xor Bit(b(0),%FlagNeg96) Then
                Reset y()
                Bit Set y(0),%FlagSig96
                Bit Set y(0),%FlagZer96
            Else
                ' Must be double
                Call Copy96A(y(), a())
                Select Case y(3) And &H00007FFF???
                Case &H00007FFF???
                Case &H00007FFE???
                    Reset y()
                    y(3)=a(3)+1
                    Bit Set y(0),%FlagInf96
                    Bit Set y(0),%FlagNor96
                Case &H00000000???
                    If Bit(y(0),%FlagNor96) Then ? "Error normal":WaitKey$
                    Shift Left y(2),1
                    If Bit(y(1),31) Then Bit Set y(2),0
                    Shift Left y(1),1
                    If Bit(y(0),31) Then Bit Set y(1),0
                    Shift Left y(0),1
                    If Bit(y(0),%FlagNor96) Then
                        Bit Reset y(0),%FlagDen96
                        Incr y(3)
                    End If
                Case Else
                    Incr y(3)
                End Select
            End If
            Function=Convert96A(y())
            Exit Function
        End If
        ' Check if y()=a()
        If Bit(a(0),%FlagInf96) Or Bit(b(0),%FlagZer96) Then
            Call Copy96A(y(), a())
            Function=Convert96A(y())
            Exit Function
        End If
        ' Check if y()=b()
        If Bit(a(0),%FlagZer96) Or Bit(b(0),%FlagInf96) Then
            Call Copy96A(y(), b())
            Function=Convert96A(y())
            Exit Function
        End If
        ' Done with special cases
        Call Absolute96A(mn(),a()): Call Absolute96A(mx(),b())
        Select Case Sign96A(mn(),mx())
        Case -1: j=0 ' |a{}|<|b{}|
        Case +1: j=1 ' |a{}|>|b{}|
        Case Else: ? "Error Unexpected equal arrays":WaitKey$
        End Select
        For i=3 To 5: ab(i,j)=a(i-3): ab(i,1-j)=b(i-3): Next i
        ab3(j)=a(3): ab3(1-j)=b(3)
        ' eab(j)=exponent treating (ab(5,j),ab(4,j),ab(3,j)} as integer
        For j=0 To 1
            eab(j)=(ab3(j) And &H00007FFF???)-&H00003FFF???-95
            If eab(j)=-16478 Then Incr eab(j) ' Denormal (&H3FFF+95=16478)
            eab(j)=eab(j)+32
            If (ab3(j) And &H00008000???) Then sab(j)=-1 Else sab(j)=+1
        Next j
        ' ab3() no longer needed.
        ' Normalize ab(,j)
        For j=0 To 1
            Do Until Bit(ab(5,j),31)
                For i=5 To 3 Step -1
                    Shift Left ab(i,j),1
                    If Bit(ab(i-1,j),31) Then Bit Set ab(i,j),0
                Next i
                Decr eab(j)
            Loop
        Next j
        ' Make eab(0)=>eab(1)
        If eab(0)<eab(1) Then
            For i=3 To 5: Swap ab(i,0),ab(i,1): Next i
            Swap eab(0),eab(1)
            Swap sab(0),sab(1)
        End If
        If eab(0)-eab(1)<6*32 Then
            Do Until eab(0)=eab(1)
                xbd=xbd Or IsTrue(Bit(ab(0,1),0))
                For i=0 To 5
                    Shift Right ab(i,1),1
                    If i<5 Then If Bit(ab(i+1,1),0) Then Bit Set ab(i,1),31
                Next i
                Incr eab(1)
            Loop
        Else
            ' Smaller term is too small to matter other than in rounding
            xbd=-1
            For i=0 To 5
                ab(i,1)=&H00000000???
            Next i
            eab(1)=eab(0)
            sab(1)=sab(0)
        End If
        ' Add
        For i=0 To 5
            q(i)=ab(i,0)*sab(0)+ab(i,1)*sab(1)
        Next i
        ' Make temporary significand (q()) positive
        x=0
        For i=0 To 5
            x=x*2^-32+q(i)
        Next i
        If Sgn(x)=-1 Then For i=0 To 5: q(i)=-q(i): Next i
        Call Finish96A(y(), q(),eab(0),Sgn(x),xbd)
        Function=Convert96A(y())
        Exit Function
    End Function
     
    Function Multiply96A(y() As Dword, _   ' Output array
        a() As Dword, b() As Dword) As Ext ' Input arrays
    ' y() <-- a() * b()
    ' Precede with Reciprocal96A() to divide.
    ' a(), b(), and y() are DWord arrays dimensioned (0:3)
    ' a() and/or b() can be in extended-precision or long format as, e.g.,
    '     Dim aa(0) As Ext At VarPtr(a(1)):aa(0)=xxx## or a(0)=xxx&
    '
    ' Methodology:
    ' As extended:  <-Unrounded extended-precision->            Maxima:
    ' DWord:        [Lo(Word,a(3))]     a(2)    a(1)    a(0)    2^32-1
    ' DWord:        [Lo(Word,b(3))]     b(2)    b(1)    b(0)    2^32-1
    '                                   --------------------
    ' Multiply DWords:
    ' QWord*:                           p(2,0)  p(1,0)  p(0,0)  2^64-2^33+1
    ' QWord*:                   p(2,1)  p(1,1)  p(0,1)          2^64-2^33+1
    ' QWord*:           p(2,2)  p(1,2)  p(0,2)                  2^64-2^33+1
    '                   =======================================
    ' * As QWord datatype doesn't exist in PB, will use Quad and assembly.
    ' Split into DWords:
    ' DWord:                    ph(2,0) ph(1,0) ph(0,0)         2^32-2
    ' DWord:                            pl(2,0) pl(1,0) pl(0,0) 2^32-1
    ' DWord:            ph(2,1) ph(1,1) ph(0,1)                 2^32-2
    ' DWord:                    pl(2,1) pl(1,1) pl(0,1)         2^32-1
    ' DWord:    ph(2,2) ph(1,2) ph(0,2)                         2^32-2
    ' DWord:            pl(2,2) pl(1,2) pl(0,2)                 2^32-1
    '           -----------------------------------------------
    ' Sum DWords:
    ' Quad:     s(5)    s(4)    s(3)    s(2)    s(1)    s(0)   ~5*2^32
    ' Max. s(): n-2     3*n-5   5*n-8   5*n-6   3*n-4   n-1    (n=2^32)
    '           =============================================
    ' Split into DWords (sh(5)=sh(0)=0:
    ' DWord:    sh(4)   sh(3)   sh(2)   sh(1)
    ' Max. sh():2       4       4       2
    ' DWord:    sl(5)   sl(4)   sl(3)   sl(2)   sl(1)   sl(0)
    ' Max. sl():n-2     n-1     n-1     n-1     n-1     n-1    (n=2^32)
    '           ---------------------------------------------
    ' Sum DWords:
    ' Quad:     s(5)    s(4)    s(3)    s(2)    s(1)    s(0)
    ' DWord:    t(5)    t(4)    t(3)    t(2)    t(1)    t(0)    2^32-1
    '          ==============================================
    ' Normalize:
    ' DWord:                            t(5)    t(4)    t(3)
    ' Round:        <-Unrounded extended-precision->
    ' DWord:        [Lo(Word,y(3))]     y(2)    y(1)    y(0)    2^32-1
    '               ========================================
    '
        Call CheckOut96A(y())
        Call Convert96A(a()): Call Convert96A(b())
        Local i,j,sg As Long
        Local ea,eb As Long ' Exponents unbiased
        Local d,d0,d1 As Dword
        Local g As Ext
        ' Significand terms only (no exponent nor sign):
        Dim wa(4) As Word At VarPtr(a(3))
        Dim p(2,2) As Local Quad
        Dim ph(2,2) As Local Dword
        Dim pl(2,2) As Local Dword
        Dim s(5) As Local Quad
        Dim sh(5) As Local Dword
        Dim sl(5) As Local Dword
        d=Bit(a(0),%FlagNeg96) Xor Bit(b(0),%FlagNeg96)
        If IsTrue(d) Then sg=-1 Else sg=+1
        ' Check if NaN
        If  Bit(a(0),%FlagNaN96)          Or _
            Bit(b(0),%FlagNaN96)          Or _
               (Bit(a(0),%FlagInf96) And _
                Bit(b(0),%FlagZer96)    ) Or _
               (Bit(b(0),%FlagInf96) And _
                Bit(a(0),%FlagZer96)    ) Then
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagNaN96
            For i=%FlagNor96-1 To %FlagNeg96: Bit Set y(0),i: Next i ' NaN
            Function=Convert96A(y())
            Exit Function
        End If
        ' Check if Zero
        If Bit(a(0),%FlagZer96) Or Bit(b(0),%FlagZer96) Then
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagZer96
            If d Then Bit Set y(0),%FlagNeg96
            Function=Convert96A(y())
            Exit Function
        End If
        ' Check if Infinity
        If Bit(a(0),%FlagInf96) Or Bit(b(0),%FlagInf96) Then
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagInf96
            If d Then Bit Set y(0),%FlagNeg96
            For i=%FlagNor96 To %FlagNeg96-1: Bit Set y(0),i: Next i ' Inf
            Function=Convert96A(y())
            Exit Function
        End If
        ' Done with special cases
        ' Neither factor equals zero so not all t() will be zero.
        For i=0 To 2:For j=0 To 2
            d0=a(i):d1=b(j)
            ' Do this in assembler since no QWord datatype in PB.
            !mov eax,d0
            !mov edx,d1
            !mul edx ' Unsigned multiply edx:eax <-- eax * edx
            !mov d0,edx
            !mov d1,eax
            ph(i,j)=d0
            pl(i,j)=d1
            s(i+j+1)=s(i+j+1)+ph(i,j)
            s(i+j+0)=s(i+j+0)+pl(i,j)
        Next j:Next i
        ' ea=exponent treating (a(2),a(1),a(0)} as integer
        ea=(a(3) And &H00007FFF???)-&H00003FFF???-95
        If ea=-16478 Then Incr ea ' Denormal (&H3FFF+95=16478)
        ea=ea+32
        ' eb=exponent treating (b(2),b(1),b(0)} as integer
        eb=(b(3) And &H00007FFF???)-&H00003FFF???-95
        If eb=-16478 Then Incr eb ' Denormal (&H3FFF+95=16478)
        eb=eb+32
        ' ea+eb=exponent treating (t(5),t(4),t(3),t(2),t(1),t(0)} as integer
        Call Finish96A(y(), s(),ea+eb+64,sg,0)
        Function=Convert96A(y())
        Exit Function
    End Function
    The next set of functions do some simple chores. Sign96A() returns a long integer equivalent to the sign of the difference (or, if just one array passed, the sign of that value). Copy96A(), Negative96A() and Absolute96A() respectively copies, negates and takes the absolute value of an 96-bit significand format array. Negative96A() can be used before Add96A() for the purpose of subtraction. The remaining three are a bit more complicated but show how these functions fit together. They are Power96A(), Reciprocal96A(), and SquareRoot96A(). The Power96A() function raises a 96-significand value to an integer power. The Reciprocal96A() function can be used before Multiply96A() to permit division. The functions Subtract96A() and Divide96A() were added to simplify those operations. Reciprocal96A() and SquareRoot96A() make use of an approximate value calculated in the normal PB fashion to create extended-precision approximations to the desired result and an additive correction term to refine that value. This is possible because the expression used to invert the expression ((1/x)*x=1 and Sqr(x)*Sqr(x)=x) can be computed to near 96-bit accuracy. One important note, a modification is made to SquareRoot96() so it actually calculates the equivalent to the PB expression:
    Sgn(x)*Sqr(Abs(x)).

    Code:
    Function Sign96A(a() As Dword, Opt b() As Dword) _ ' Input arrays
        As Long                                        ' Output long
        ' Output <-- Sgn(a()-b()) (or Sgn(a()) if b() not passed)
        Call Convert96A(a())
        Local i,j As Long
        If Bit(a(0),%FlagNaN96) Then ? "Error NaN in Sign":WaitKey$
        If ArrayAttr(b(),0) Then
            ' b() was passed. Return Sgn(a()-b())
            Call Convert96A(b())
            If Bit(b(0),%FlagNaN96) Then ? "Error NaN in Sign":WaitKey$
            If Bit(a(0),%FlagZer96) And Bit(b(0),%FlagZer96) Then
               Function=0: Exit Function
            End If
            j=IsTrue Bit(a(0),%FlagNeg96)
            i=j Xor IsTrue(Bit(b(0),%FlagNeg96))
            If i Then
                i=1+2*j
            Else
                j=1+2*j
                If (a(3)And&H00007FFF???)>(b(3)And&H00007FFF???) Then i=+j
                If (a(3)And&H00007FFF???)<(b(3)And&H00007FFF???) Then i=-j
                If i Then Exit If
                If a(2)>b(2) Then i=+j
                If a(2)<b(2) Then i=-j
                If i Then Exit If
                If a(1)>b(1) Then i=+j
                If a(1)<b(1) Then i=-j
                If i Then Exit If
                If a(0)>b(0) Then i=+j
                If a(0)<b(0) Then i=-j
            End If
        Else
            ' b() was not passed. Return Sgn(a())
            If Bit(a(0),%FlagZer96) Then
                i=0
            Else
                i=1-2*Bit(a(0),%FlagNeg96)
            End If
        End If
        Function=i
    End Function
     
    Function Copy96A(y() As Dword, _ ' Output array
        a() As Dword) As Ext         ' Input array
        ' y() <-- a()
        Call CheckOut96A(y())
        Call Convert96A(a())
        Local i As Long
        For i=0 To 3: y(i)=a(i): Next i
        Function=Convert96A(y())
    End Function
     
    Function Negative96A(y() As Dword, _ ' Output array
        a() As Dword) As Ext             ' Input array
        ' y() <-- -a()
        Call CheckOut96A(y())
        Call Convert96A(a())
        Call Copy96A(y(), a())
        If Bit(y(0),%FlagNaN96)=0 Then Bit Toggle y(0),%FlagNeg96
        Function=Convert96A(y())
    End Function
     
    Function Absolute96A(y() As Dword, _ ' Output array
        a() As Dword) As Ext             ' Input array
        ' y() <-- |a()|
        Call CheckOut96A(y())
        Call Convert96A(a())
        Call Copy96A(y(), a())
        If Bit(y(0),%FlagNaN96)=0 Then Bit Reset y(0),%FlagNeg96
        Function=Convert96A(y())
    End Function
     
    Function Power96A(y() As Dword, _ ' Output array
        a() As Dword, _               ' Input array
        ByVal n As Long) As Ext       ' Integer power
        ' y() <-- a()^n
        ' n is restricted to long integer
        ' Although 0^0=1 in PB, here 0^0=NaN
        Call CheckOut96A(y())
        Call Convert96A(a())
        Local i As Long
        Local sg As Long ' Sign of n
        Dim b(3) As Dword ' b()=|a{}|
        Dim t(3) As Dword ' Tempoary in case y=a
        If Bit(a(0),%FlagNaN96) Then
            Call Copy96A(y(), a())
            Function=Convert96A(y())
            Exit Function
        End If
        If Bit(a(0),%FlagInf96) Then
            Reset y()
            Bit Set y(0),%FlagSig96
            If Bit(a(0),%FlagNeg96) Then Bit Set y(0),%FlagNeg96
            Select Case Sgn(n)
            Case -1
                Bit Set y(0),%FlagZer96
            Case 0
                Bit Set y(0),%FlagNaN96
                For i=%FlagNor96-1 To %FlagNeg96: Bit Set y(0),i: Next i
            Case +1
                Bit Set y(0),%FlagInf96
                For i=%FlagNor96 To %FlagNeg96-1: Bit Set y(0),i: Next i
            End Select
            Function=Convert96A(y())
            Exit Function
        End If
        If Bit(a(0),%FlagZer96) Then
            Reset y()
            Bit Set y(0),%FlagSig96
            If Bit(a(0),%FlagNeg96) Then Bit Set y(0),%FlagNeg96
            Select Case Sgn(n)
            Case -1
                Bit Set y(0),%FlagInf96
                For i=%FlagNor96 To %FlagNeg96-1: Bit Set y(0),i: Next i
            Case 0
                Bit Set y(0),%FlagNaN96
                For i=%FlagNor96-1 To %FlagNeg96: Bit Set y(0),i: Next i
            Case +1
                Bit Set y(0),%FlagZer96
            End Select
            Function=Convert96A(y())
            Exit Function
        End If
        ' From here use t() in case y() overlays a()
        Bit Set t(0),%FlagSig96
        For i=%FlagNor96 To %FlagNeg96-2: Bit Set t(0),i: Next i ' One
        i=Abs(n)
        Call Absolute96A(b(), a()) ' Working array (>0)
        If n<0 Then Call Reciprocal96A(b(), b())
        Do Until i=0 Or _
            IsTrue(Bit(t(0),%FlagInf96)) Or _
            IsTrue(Bit(t(0),%FlagZer96))
            If Bit(i,0) Then
                Call Multiply96A(t(), b(),t())
            End If
            Shift Right i,1
            If i>0 Then
                Call Multiply96A(b(), b(),b())
                If Bit(b(0),%FlagInf96) Then
                    Reset t()
                    Bit Set t(0),%FlagSig96
                    Bit Set t(0),%FlagInf96
                    For i=%FlagNor96 To %FlagNeg96-1:Bit Set t(0),i:Next i
                    Exit Do
                End If
                If Bit(b(0),%FlagZer96) Then
                    Reset t()
                    Bit Set t(0),%FlagSig96
                    Bit Set t(0),%FlagZer96
                    Exit Do
                End If
            End If
        Loop
        Copy96A(y(),t())
        ' Only way answer is negative is if a() is negative and n is odd.
        If Bit(a(0),%FlagNeg96)+Bit(n,0)=2 Then Bit Set y(0),%FlagNeg96
        Function=Convert96A(y())
    End Function
     
    Function Reciprocal96A(y() As Dword, _ ' Output array
        a() As Dword) As Ext             _ ' Input array
        ' y() <-- 1/a()
        ' Methodology: If a*y=1, y=r+x, where r~1/a then
        '     a*r+a*x=1, x=(1-a*r)/a, y=r+(1-a*r)*r
        '
        ' Examples of significands for values near 2^n:
        ' Significand:    &B1000...0001  &B1111...1111  &B1000...0000
        ' a:              1 + 2^-63      1 - 2^-64      1
        ' y:              1 - 2^-63      1 + 2^-64      1
        ' r:              &B1111...1110  &B1000...0000  &B1000...0000
        ' r:              1 - 2^-63      1              1
        ' a*r:            1 - 2^126 = 1  1 - 2^-64      1
        ' 1-a*r:          0              2^64           0
        ' (1-a*r)*r=x:    0              2^64           0
        ' r+x=y:          1 - 2^-63      1 + 2^-64      1 (all OK)
        '
        ' 3.6451995318824746025284059336194e-4951 = smallest denormal
        ' 8.4052578577802337661123444847897e-4933 = 1/largest normal
        ' 3.3621031431120935058981578641335e-4932 = largest denormal
        ' 3.3621031431120935062626778173218e-4932 = smallest normal
        ' 2.9743287383930794127143983165700e+4931 = 1/smallest normal
        ' 1.1897314953572317650212638530310e+4932 = largest normal
        '
        Call CheckOut96A(y())
        Call Convert96A(a())
        Local i As Long
        Dim aa(0) As Ext At VarPtr(a(1))
        Dim r(3) As Dword ' Approximate reciprical
        Dim rr(0) As Ext At VarPtr(r(1))
        Dim o(3) As Dword ' One
        Dim t(3) As Dword ' Temporary scratch
        Dim x(3) As Dword ' Correction
        If Bit(a(0),%FlagNaN96) Then
            Call Copy96A(y(), a())
            Function=Convert96A(y())
            Exit Function
        End If
        If Bit(a(0),%FlagInf96) Then
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagZer96
            If Bit(a(0),%FlagNeg96) Then Bit Set y(0),%FlagNeg96
            Function=Convert96A(y())
            Exit Function
        End If
        rr(0)=1/aa(0) ' r= approximately 1/a
        ' rr(0) can be denormal (OK) or infinite (not OK)
        Call Convert96A(r())
        If Bit(a(0),%FlagZer96) Or Bit(r(0),%FlagInf96) Then
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagInf96
            If Bit(a(0),%FlagNeg96) Then Bit Set y(0),%FlagNeg96
            For i=%FlagNor96 To %FlagNeg96-1: Bit Set y(0),i: Next i
            Function=Convert96A(y())
            Exit Function
        End If
        Call Multiply96A(t(),a(),r()) ' t=a*r
        Call Negative96A(t(),t())     ' t=-a*r
        o(0)=1: Call Convert96A(o())  ' o= exactly 1
        Call Add96A(t(),o(),t())      ' t=1-a*r
        Call Multiply96A(x(),r(),t()) ' x=r*(1-a*r)
        Call Add96A(y(),r(),x())      ' y=r+r*(1-a*r)
        Function=Convert96A(y())
    End Function
     
    Function SquareRoot96A(y() As Dword, _ ' Output array
        a() As Dword) As Ext               ' Input array
        ' y() <-- Sgn(a())*Sqr(Abs(a()))
        ' This is differant than PB for negative arguments.
        '
        ' Methodology:
        ' If y*y=+a, y=r+x, where r*r~a then
        '     r*r+2*r*x~a, x=(a-r*r)/(2*r), y=r+(a/r-r)*(1/2)
        '
        Call CheckOut96A(y())
        Call Convert96A(a())
        Local i As Long
        Dim b(3) As Dword
        Dim bb(0) As Ext At VarPtr(b(1))
        Dim r(3) As Dword ' Approximate root
        Dim rr(0) As Ext At VarPtr(r(1))
        Dim t(3) As Dword ' Temporary scratch
        Dim tt(0) As Ext At VarPtr(t(1))
        Dim x(3) As Dword ' Correction
        If Bit(a(0),%FlagNaN96) Then
            Call Copy96A(y(), a())
            Function=Convert96A(y())
            Exit Function
        End If
        If Bit(a(0),%FlagZer96) Then
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagZer96
            If Bit(a(0),%FlagNeg96) Then Bit Set y(0),%FlagNeg96
            Function=Convert96A(y())
            Exit Function
        End If
        If Bit(a(0),%FlagInf96) Then
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagInf96
            If Bit(a(0),%FlagNeg96) Then Bit Set y(0),%FlagNeg96
            For i=%FlagNor96 To %FlagNeg96-1: Bit Set y(0),i: Next i
            Function=Convert96A(y())
            Exit Function
        End If
        ' If 0<x<1, x<Sqr*(x)<1; if 1<x, 1<Sqr(x)<x so function is always
        '     nearer to Sgn(x) than x unless x=(-1,0,+1). There is no
        '     migration towards zero nor infinity.
        Call Absolute96A(b(),a())      ' b=|a|
        rr(0)=Sqr(Abs(bb(0)))          ' r= approximately Sqr(|a|)
        Call Multiply96A(t(),r(),r())  ' t=r*r
        Call Negative96A(t(),t())      ' t=-r*r
        Call Add96A(x(),b(),t())       ' x=|a|-r*r
        Call Add96A(t(),r(),r())       ' r=2*r
        Call Reciprocal96A(t(),t())    ' t=1/(2*r)
        Call Multiply96A(x(),x(),t())  ' x=(|a|-r*r)/(2*r)
        Call Add96A(y(),r(),x())       ' y=r+(|a|-r*r)/(2*r)
        If Bit(a(0),%FlagNeg96) Then Negative96A(y(),y()) ' Xfer sign
        Function=Convert96A(y())       ' y=Sqr(Abs(a))*Sgn(a)
    End Function
     
    Function Subtract96A(y() As Dword, _   ' Output array
        a() As Dword, b() As Dword) As Ext ' Input arrays
        ' y <-- a-b
        Call CheckOut96A(y())
        Call Convert96A(a()): Call Convert96A(b())
        Dim t(3) As Dword
        ' Leave it to other functions to catch NaN's etc.
        Call Negative96A(t(), b())
        Call Add96A(y(), a(),t())
        Function=Convert96A(y())
    End Function
     
    Function Divide96A(y() As Dword, _     ' Output array
        a() As Dword, b() As Dword) As Ext ' Input arrays
        ' y <-- a/b
        Call CheckOut96A(y())
        Call Convert96A(a()): Call Convert96A(b())
        Dim t(3) As Dword
        ' Leave it to other functions to catch NaN's etc.
        Call Reciprocal96A(t(), b())
        Call Multiply96A(y(), a(),t())
        Function=Convert96A(y())
    End Function
    In this last batch of code are three subroutines that are used internally. The sub BankersRounding96A() tweaks element 0 to simplify bankers' rounding and addresses a peculiarity in rounding denormals. The sub CheckOut96A() checks the output array dimensions. The sub Finish96A() tidies up the longer 6-element arrays used in addition and multiplication. The sub RoundUp96A() rounds up a 96-bit significand and, by setting element 0 of a dummy copy to &HFFFFFFFF, can be used to round up a 64-bit significand.

    Code:
    Sub BankersRounding96A(y() As Dword) ' For internal use only
        ' Handles resetting %FlagInc96 when y(0)=&H80000000???
        ' Tweaking y(0) to &H7FFFFFFF??? conforms to bankers' rounding
        '     without introducing any significant error in computation.
        ' Calling Convert96a() might be unwise since this is internal.
        '     so just check bounds and %FlagSig96.
        Call CheckOut96A(y())
        If Bit(y(0),%FlagSig96)=0 Then ? "Error Not 96-bit sig.":WaitKey$
        If y(0)=&H80000000??? Then
            ' For denormals, PB never rounds up exact halves
            '     but here just check if y(1) is odd and if so
            '     make y(0)=&H7FFFFFFF??? resetting &FlagInc96.
            If Bit(y(1),0) Then
                Decr y(0)
                ' Next If branch reverses the above Decr if denormal.
                ' PB (or likely the Pentium 4 FPU) never rounds up
                '     a denormal if the excess is exactly one half.
                ' Since this is inconsistent with PB documentation
                '     it is commented for now.
                '----------------------------------------'
                ' If Bit(y(0),%FlagDen96) Then Incr y(0) '
                '----------------------------------------'
            End If
        End If
    End Sub
     
    Sub CheckOut96A(y() As DWord)
        ' Check dimensions of output array
        If ArrayAttr(y(),3)<>1 Then ? "Error Output dimensions":WaitKey$
        If LBound(y)<>0 Or UBound(y)<>3 Then ? "Error Bounds 0:3":WaitKey$
    End Sub
     
    Sub Finish96A( _    ' For internal use only
        y() As Dword, _ ' y(3) = result in 96-bit significand format
        q() As Quad, _  ' q(5) = temporary significand array (quad)
        ec As Long, _   ' ec = exponent of y(), the result
        sg As Long, _   ' sg = sign of result = -1/+1
        xbd As Long)    ' xbd = -1 if excess set bits were discarded
        ' Terminal sub for Multiply96A() and Add96A()
        If ArrayAttr(q(),3)<>1 Then ? "Error Quad dimensions":WaitKey$
        If LBound(q)<>0 Or UBound(q)<>5 Then ? "Error Bounds 0:5":WaitKey$
        Call CheckOut96A(y())
        Local i As Long
        Local d As Dword
        Local f As Ext ' Result of Round_192_to_96 sub
        Dim t(5) As Dword ' q(5) = temporary significand array (dword)
        ' Variables and arrays only used after y(3) established
        '     in last section rounding (0:5) array to (0:3) array:
        Local IncrSig As Long ' True (-1) if rounding incr. significand
        Local Two32 As Quad: Two32=&H0000000100000000&& ' constant 2^32
        Dim yy(0) As Ext At VarPtr(y(1)) ' Approx. result
        Local yy As Ext  ' Refined yy(0) for returned extended result
        Dim s64(0) As Quad At VarPtr(yy) ' 64-bit significand of f
        Dim w(4) As Word At VarPtr(yy) ' w(4)=sign & exponent of f
        If sg=0 Then ? "Unexpected zero":WaitKey$
        ' NB: In what follows, Mak(Quad,0,1)=&H100000000&&
        If q(5)<0 Then ?"Error q(5) sign":WaitKey$
        For i=0 To 4
            Do While q(i)<0 ' Negative only only if called from Add
                Decr q(i+1)
                q(i)=q(i)+Two32
            Loop
            Do While q(i)=>Two32
                Incr q(i+1)
                q(i)=q(i)-Two32
            Loop
        Next i
        Do While q(5)=>Two32
            For i=5 To 0 Step -1
                If i Then If Bit(q(i),0) Then q(i-1)=q(i-1)+Two32
                Shift Right q(i),1
            Next i
            Incr ec
        Loop
        For i=0 To 5
            If q(i)<0 Or q(i)=>Two32 Then ?"Error range":WaitKey$
        Next i
        ' As 3*32=96 and 5*32=160, the maximum product has
        ' q(5)=(2^96-1)*(2^96-1)\2^160=(2^192-2^97+1)\2^160=2^32-2<2^32
        For i=1 To 5
            If Hi(Dword,q(i)) Then ? "Overflow":WaitKey$
            t(i)=q(i)
        Next i
        ' Normalize t()
        ' Maximum t(5)=t(4)=&HFFFFFFFF???; t(3)=&HFFFFFFFE???;
        '         t(2)=t(1)=&H00000000???; t(0)=&H00000001???
        ' Normalize t()
        Do Until t(5)
            For i=5 To 1 Step -1: t(i)=t(i-1): Next i
            Reset t(0)
            ec=ec-32
        Loop
        Do Until Bit(t(5),31)
            For i=5 To 0 Step -1
                Shift Left t(i),1
                If i Then If Bit(t(i-1),31) Then Bit Set t(i),0
            Next i
            Decr ec
        Loop
        ec=ec+63+&H3FFF?? ' Apply biases
        ' Now ec=>-16445 then normal result (=> 2^-16382=2^-&H3FFE)
        ' and ec<=-16446 then denormal result (< 2^-16382)
        Select Case ec
        Case <=-96
            ' Zero
            ec=-96
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagZer96
            If sg=-1 Then Bit Set y(0),%FlagNeg96
            Exit Sub
        Case -95 To 0
            ' Denormal
            ' (&H0001 8000 ...)/2=&H0000 4000 ... (not &H0000 8000 ...)
            ' so do one extra shift right.
            Decr ec
            Do
                For i=0 To 5
                    Shift Right t(i),1
                    If i<5 Then If Bit(t(i+1),0) Then Bit Set t(i),31
                Next i
                Incr ec
            Loop Until ec=0
            y(3)=0
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagDen96
            If sg=-1 Then Bit Set y(0),%FlagNeg96
        Case =>&H00007FFF&
            ' Infinity
            ec=&H00007FFF&
            Reset y()
            Bit Set y(0),%FlagSig96
            Bit Set y(0),%FlagInf96
            If sg=-1 Then Bit Set y(0),%FlagNeg96
            For i=%FlagNor96 To %FlagNeg96-1: Bit Set y(0),i: Next i
            Exit Sub
        Case Else
            y(3)=ec ' Exponent
            Bit Set y(0),%FlagSig96
            If sg=-1 Then Bit Set y(0),%FlagNeg96
        End Select
        ' Rounds (0:5) array to (0:3) array
        For i=0 To 2: y(i)=t(i+3): Next i
        yy=yy(0)
        IncrSig=t(2)>&H80000000???
        If t(2)=&H80000000??? Then
            If t(1) Then
                IncrSig=-1
            Else
                If t(0) Then
                    IncrSig=-1
                Else
                    IncrSig=xbd Or IsTrue(Bit(y(0),0))
                End If
            End If
        End If
        If IncrSig Then Call RoundUp96A(y())
        Call BankersRounding96A(y())
    End Sub
     
    Sub RoundUp96A( _ ' For internal use only
        y() As Dword) ' Input array
        ' Rounds up 96-bit significand
        Call CheckOut96A(y())
        Local d As Dword
        Incr y(0)
        If y(0)=0 Then
            ' If y(0) initially &HFFFFFFFF???, rounding starts here
            Incr y(1)
            If y(1)=0 Then
                Incr y(2)
                If y(2)=0 Then
                    ' Pass 2^n boundary
                    Incr y(3)
                    Bit Set y(0),%FlagNor96
                    If (y(3) And &H00007FFF???)=&H00007FFF??? Then
                        Bit Set y(0),%FlagInf96
                    End If
                ElseIf y(2)=&H80000000??? Then
                    ' Denormal becomes normal
                    Bit Reset y(0),%FlagDen96
                    Incr y(3)
                End If
            End If
        End If
    End Sub
    There is quite a bit of redundancy in these functions. This is intentional as they are still being developed. It also helps to track coding errors. Also since this suite is intended to be supplemental and used in R&D work, it should not form part of any final program. One use for these functions is when it is desirable to create a table of mathematical constants embedded in the code as !dw or !dd data. The coding would be something like:

    Code:
    %MaxN=...
    Function MyFunction(N As DWord) As Ext
        Dim MyArray(%MaxN) As Ext At CodePtr(MyLabel)
        If N<=%MaxN Then Function=MyArray(N)
        Exit Function
    #Align 2 ' Optional PBCC version 5+
    MyLabel:
        !dw &H...,&H...,&H...,&H..., &H... ' MyArray(0)     | Output96A() 
        !dw &H...,&H...,&H...,&H..., &H... ' MyArray(1)     | can create
        !dw &H...,&H...,&H...,&H..., &H... ' MyArray(2)     | these with
        !dw &H...,&H...,&H...,&H..., &H... ' MyArray(3)     | the use of
        ...                                                 | Clipboard
        !dw &H...,&H...,&H...,&H..., &H... ' MyArray(%MaxN) | statements.
    End Function
    If one wants a set of data for testing, I would suggest checking out the Factorial96A() function that appears in a later post or there is also a program that will give the best extended-precision values for all integer powers of ten on my post in the PBCC forum. Note however the correction to the first line of data later in that thread. To find it do a search for the function's name: BestPowerOfTen.

    ________________
    Mark Longley-Cook
    Last edited by Mark Longley-Cook; 9 Feb 2009, 12:00 PM.

  • #2
    This post will only be here a short time. For those of you that monitor the Forum for recent posts and may not pick up edit dates, there was a fatal error in the structure of my Type96 UDT that I should have caught. If you downloaded the code since it was posted Monday Jan. 26 and today, Thursday Jan. 29, please make sure the structure in your download is as follows:

    Code:
    Type Type96 Dword
        L As Long ' Can use to load a long integer value
        X As Ext  ' Can use to load an extended-precision value
        F As Word ' Flags and reserved bits
    End Type
    By the way no use was made of the member names in the original post and they are now simplified for later enhancements. Sorry for the inconvenience. The other edits just add a few features or are cosmetic.

    If you downloaded the code since it was posted Monday Jan. 26 and today, Thursday Feb. 5, please make sure the Val96A() function has been changed to correctly evaluate denormals. The correction is part of a Select Case/End Select block that appears below the IncludePowerSign label and is as follows:

    Code:
        Case <=0
            ' Denormal
            Do While b(0)
                Shift Right y(0),1
                If Bit(y(1),0) Then Bit Set y(0),31
                Shift Right y(1),1
                If Bit(y(2),0) Then Bit Set y(1),31
                Shift Right y(2),1
                Incr b(0)
            Loop
            If y(0)=0 And y(1)=0 And y(2)=0 Then
                Bit Set y(0),%FlagZer96
            Else
                Bit Set y(0),%FlagDen96
            End If
    End Select is the next statement

    ________________
    Mark Longley-Cook
    Last edited by Mark Longley-Cook; 5 Feb 2009, 11:54 AM.

    Comment


    • #3
      96-bit Significand Factorial Function

      The factorial function of an integer n (n!) is the product of all integers from one through n with 0! defined to be one. To make it consistent with the more general Gamma function, factorials of negative integers are usually defined to be infinity. In extended-precision, any n! for n>1754 would be infinity. Tabular values below were first calculated precisely to avoid any accumulation of error and then converted to 96-bit significand values using the Val96A() and String96A() functions. On my aged machine it took 12 hours, but it was easier to let it run overnight than to make the most obvious changes to speed the calculation. Appending a final infinite value (with %FlagInf96 bit set) keeps everything in one table. The "..\" in the #Include path is MS-DOS code for the parent directory (i.e., folder) because that's where I saved it. (But PB does not recognize "...\" as the grandparent directory.) Change the path and filename to whatever is appropriate.

      Code:
      Function Factorial96T(y As Type96, n As Long) As Ext
          ' y=n!
          Dim y96(3) As DWord At VarPtr(y)
          Function=Factorial96A(y96(), n)
      End Function
       
      Function Factorial96A(y() As DWord, _ ' Output array
          ByVal n As Long) As Ext           ' Input argument 
          ' y <-- n!
          Dim f(3,1755) As DWord At CodePtr(Factorial_Table)
          If n<0 Then n=1755 Else n=Min&(n,1755)
          Dim d(3) As DWord At VarPtr(f(0,n))
          Call Copy96A(y(), d())
          Function=Convert96A(y())
          Exit Function
      #Align 16
      Factorial_Table:
      #Include "..\Data\Data96\Factorial96.txt"
      End Function
      The Factorial96.txt file should be marked read-only and is as follows:

      Code:
      ' 96-bit significand factorials 0! to 1754! and +infinity.
      !dd &H00000000, &H00000000,&H80000000, &H80003FFF ' 0!
      !dd &H00000000, &H00000000,&H80000000, &H80003FFF ' 1!
      !dd &H00000000, &H00000000,&H80000000, &H80004000 ' 2!
      !dd &H00000000, &H00000000,&HC0000000, &H80004001 ' 3!
      !dd &H00000000, &H00000000,&HC0000000, &H80004003 ' 4!
      !dd &H00000000, &H00000000,&HF0000000, &H80004005 ' 5!
      ' Limit of byte.
      !dd &H00000000, &H00000000,&HB4000000, &H80004008 ' 6!
      !dd &H00000000, &H00000000,&H9D800000, &H8000400B ' 7!
      ' Limit of integer.
      !dd &H00000000, &H00000000,&H9D800000, &H8000400E ' 8!
      ' Limit of word.
      !dd &H00000000, &H00000000,&HB1300000, &H80004011 ' 9!
      !dd &H00000000, &H00000000,&HDD7C0000, &H80004014 ' 10!
      !dd &H00000000, &H00000000,&H98454000, &H80004018 ' 11!
      !dd &H00000000, &H00000000,&HE467E000, &H8000401B ' 12!
      ' Limit of long-integer and double-word.
      !dd &H00000000, &H00000000,&HB9946600, &H8000401F ' 13!
      !dd &H00000000, &H00000000,&HA261D940, &H80004023 ' 14!
      !dd &H00000000, &H00000000,&H983BBBAC, &H80004027 ' 15!
      !dd &H00000000, &H00000000,&H983BBBAC, &H8000402B ' 16!
      !dd &H00000000, &HC0000000,&HA1BF7766, &H8000402F ' 17!
      !dd &H00000000, &H98000000,&HB5F76653, &H80004033 ' 18!
      !dd &H00000000, &H44800000,&HD815C983, &H80004037 ' 19!
      !dd &H00000000, &H0AD00000,&H870D9DF2, &H8000403C ' 20!
      ' Limit of quad-integer.
      !dd &H00000000, &HAE310000,&HB141DF4D, &H80004040 ' 21!
      !dd &H00000000, &HCF836000,&HF3BA930A, &H80004044 ' 22!
      !dd &H00000000, &HC5266D00,&HAF2E19AF, &H80004049 ' 23!
      !dd &H00000000, &HD3DCD1C0,&H83629343, &H8000404E ' 24!
      !dd &H00000000, &HFB0907BC,&HCD4A0619, &H80004052 ' 25!
      ' Limit of full accuracy extended-precision.
      !dd &HC0000000, &H1BF75648,&HA6CC24F5, &H80004057 ' 26!
      !dd &H62000000, &HCF98B0CD,&H8CBC3F2E, &H8000405C ' 27!
      !dd &H6B800000, &HEB4B3567,&HF6496E91, &H80004060 ' 28!
      !dd &HB96C0000, &H3D3C2865,&HDF328C34, &H80004065 ' 29!
      !dd &H5DD54000, &HF96865DF,&HD13F6370, &H8000406A ' 30!
      !dd &H62E69600, &H719D22B0,&HCAB56855, &H8000406F ' 31!
      !dd &H62E69600, &H719D22B0,&HCAB56855, &H80004074 ' 32!
      !dd &HE5FDCAB0, &H1D2A0BC5,&HD10B1398, &H80004079 ' 33!
      !dd &H445DA75B, &H9EFCAC82,&HDE1BC4D1, &H8000407E ' 34!
      ' Limit of single-precision.
      !dd &H7AC66F0C, &H45E45CAE,&HF2EE5F45, &H80004083 ' 35!
      !dd &H250F9E76, &HF7507422,&H88A61596, &H80004089 ' 36!
      !dd &H7ADA0F39, &H8DF50647,&H9E0008F6, &H8000408E ' 37!
      !dd &HE1E2F214, &HC892F774,&HBBA00AA4, &H80004093 ' 38!
      !dd &H734C9708, &HD4731D96,&HE4AB0CF8, &H80004098 ' 39!
      !dd &H080FDE65, &H84C7F27E,&H8EEAE81B, &H8000409E ' 40!
      !dd &H7A5454F1, &H42202EB1,&HB71CF963, &H800040A3 ' 41!
      !dd &HF08EAF7D, &H46CA3D48,&HF0560752, &H800040A8 ' 42!
      !dd &H019FDDE8, &H478FE12D,&HA179CCEB, &H800040AE ' 43!
      !dd &HE23BD11F, &H8265D59D,&HDE0779C3, &H800040B3 ' 44!
      !dd &H03120F0A, &H77AF9A33,&H9C1D419D, &H800040B9 ' 45!
      !dd &H5469F59E, &H5C0C6DA9,&HE06A0E52, &H800040BE ' 46!
      !dd &H59FDD060, &H7B992088,&HA4CDE284, &H800040C4 ' 47!
      !dd &H86FCB890, &HB965B0CC,&HF734D3C6, &H800040C9 ' 48!
      !dd &H97597D4E, &H25F1DB5C,&HBD447224, &H800040CF ' 49!
      !dd &H563DE9E5, &H3DA4F360,&H93DD792C, &H800040D5 ' 50!
      !dd &H8972ACC5, &H823EE3E1,&HEBA8F91E, &H800040DA ' 51!
      !dd &H3FAD2C60, &HC9D31927,&HBF794A68, &H800040E0 ' 52!
      !dd &H80BB68C0, &HC722D0D4,&H9E90719E, &H800040E6 ' 53!
      !dd &H4C9E2062, &HF8056033,&H85C9DFDD, &H800040EC ' 54!
      !dd &H2BAFC7A8, &H82493D58,&HE5F2F8C5, &H800040F1 ' 55!
      !dd &H2639CEB3, &HD20015AD,&HC93499AC, &H800040F7 ' 56!
      !dd &H360B7C17, &HEB08134E,&HB332D8DD, &H800040FD ' 57!
      !dd &HE0FA6875, &H1CFF517E,&HA2661489, &H80004103 ' 58!
      !dd &HF766D84C, &H66BB5F20,&H95B61AEE, &H80004109 ' 59!
      !dd &HE7F06AC7, &H804FA92E,&H8C5AB93F, &H8000410F ' 60!
      !dd &HB51125C6, &H864BED40,&H85C67890, &H80004115 ' 61!
      !dd &HAF689C98, &H02198DD6,&H819844CC, &H8000411B ' 62!
      !dd &HA955F44B, &HA4224F3E,&HFF23C771, &H80004120 ' 63!
      !dd &HA955F44B, &HA4224F3E,&HFF23C771, &H80004126 ' 64!
      !dd &HD1FDA60E, &HB5596C3D,&H81902B47, &H8000412D ' 65!
      !dd &HC08D933E, &HF304379F,&H859CACA1, &H80004133 ' 66!
      !dd &H3D943625, &H8A686A3B,&H8BE004B9, &H80004139 ' 67!
      !dd &HF16D7988, &H230EF0DE,&H949E0505, &H8000413F ' 68!
      !dd &H5C4A0706, &H89CC1BB0,&HA03A5D69, &H80004145 ' 69!
      !dd &HE4F0F7AF, &H6EB73E48,&HAF3FD62B, &H8000414B ' 70!
      !dd &HDDFB52C6, &H2ED34918,&HC26AD198, &H80004151 ' 71!
      !dd &HF9BABD1F, &H34ADB23B,&HDAB82BCB, &H80004157 ' 72!
      !dd &H68D8FFB7, &HC8161F4C,&HF97A11F3, &H8000415D ' 73!
      !dd &H2C9D73D6, &HEFACCA18,&H903A9260, &H80004164 ' 74!
      !dd &H544883BF, &H98DE7CD4,&HA904A389, &H8000416A ' 75!
      !dd &H24161C72, &H6588343C,&HC8B58233, &H80004170 ' 76!
      !dd &H5B6A9A39, &HD627DED8,&HF17A60A5, &H80004176 ' 77!
      !dd &HD7B4F5FB, &H0E804BCB,&H932692E5, &H8000417D ' 78!
      !dd &H9E435FA2, &HBDE65D8F,&HB5A39D52, &H80004183 ' 79!
      !dd &H85D4378A, &H6D5FF4F3,&HE30C84A7, &H80004189 ' 80!
      !dd &H1AB04B26, &HF336B902,&H8FADEBF1, &H80004190 ' 81!
      !dd &HB231E048, &HFF9E1D0A,&HB816D64D, &H80004196 ' 82!
      !dd &HDF18AEDD, &H27810DA9,&HEEBD9DED, &H8000419C ' 83!
      !dd &H7A6832C1, &HA1ECB0F7,&H9CAC6FA3, &H800041A3 ' 84!
      !dd &HAE926369, &H530E5B08,&HD0150445, &H800041A9 ' 85!
      !dd &HD54A5ACA, &H93CDA529,&H8BCE1EDE, &H800041B0 ' 86!
      !dd &HDDF1136B, &H90EB8C84,&HBE0C31F6, &H800041B6 ' 87!
      !dd &H5895BD5A, &H83A1F09B,&H82A86259, &H800041BD ' 88!
      !dd &H07303B51, &H7B0D3298,&HB5B228C4, &H800041C3 ' 89!
      !dd &HCA1BD369, &H4D0A8F25,&HFF828954, &H800041C9 ' 90!
      !dd &HDDAFC84D, &HEEC581C4,&HB5A6CDA1, &H800041D0 ' 91!
      !dd &H7F5657F7, &H639DF545,&H828FE3CC, &H800041D7 ' 92!
      !dd &HFD0977D3, &H00C18868,&HBDB91705, &H800041DD ' 93!
      !dd &H19D2F3FF, &HAC8E202D,&H8B53ECE7, &H800041E4 ' 94!
      !dd &HF255222F, &HE422F7C2,&HCED093A7, &H800041EA ' 95!
      !dd &H35BFD9A3, &HEB1A39D2,&H9B1C6EBD, &H800041F1 ' 96!
      !dd &H9976C5DB, &HD853BFA2,&HEB1717D7, &H800041F7 ' 97!
      !dd &H7D7EEF7C, &H41A01EB8,&HB3FDAE41, &H800041FE ' 98!
      !dd &HB1102D3A, &H78C1D7C2,&H8B3634C6, &H80004205 ' 99!
      !dd &H34A946AA, &H1CAEE120,&HD984B276, &H8000420B ' 100!
      !dd &H698D91C2, &H32A1FDA3,&HABA2B4D1, &H80004212 ' 101!
      !dd &H381CD027, &HB459161E,&H88C5A816, &H80004219 ' 102!
      !dd &HA24E5EFF, &H8A3F5F98,&HDC1E1A84, &H8000421F ' 103!
      !dd &H03DFAD2F, &HB0537DAC,&HB2D8758B, &H80004226 ' 104!
      !dd &H1B2D7C10, &H96A47D17,&H92B5906C, &H8000422D ' 105!
      !dd &H4503557B, &HD9806F2E,&HF2FCB733, &H80004233 ' 106!
      !dd &HADB0C975, &H57D15CF0,&HCB1F4125, &H8000423A ' 107!
      !dd &H128D29FB, &H8218A66B,&HAB625EF7, &H80004241 ' 108!
      !dd &H2DCC35C0, &HC4C8FDB7,&H91F1C4DE, &H80004248 ' 109!
      !dd &HD6B6FC61, &HE2397412,&HFAD78A5E, &H8000424E ' 110!
      !dd &H5632AEDC, &H482DD2A8,&HD986E9FE, &H80004255 ' 111!
      !dd &H4B6C5901, &H7F281853,&HBE560CBE, &H8000425C ' 112!
      !dd &H8895A693, &H2C416579,&HA807F740, &H80004263 ' 113!
      !dd &H3DA5485B, &H276A3E60,&H95A71835, &H8000426A ' 114!
      !dd &H77627F01, &HC169740A,&H86741FBF, &H80004271 ' 115!
      !dd &HF8628633, &H8E8F2252,&HF3B2798B, &H80004277 ' 116!
      !dd &HD70A0EAA, &H904ED55F,&HDEC12319, &H8000427E ' 117!
      !dd &H5A3D4585, &H9108ACB4,&HCD5A0C5B, &H80004285 ' 118!
      !dd &HABE4F6A2, &H20D6108F,&HBEE9B77D, &H8000428C ' 119!
      !dd &HB126A738, &H4EC8AF86,&HB2FB1C05, &H80004293 ' 120!
      !dd &H53768A12, &H0479B5ED,&HA931607D, &H8000429A ' 121!
      !dd &H338CFB9A, &H28440166,&HA1430FF7, &H800042A1 ' 122!
      !dd &H358979C6, &H80B15958,&H9AF67157, &H800042A8 ' 123!
      !dd &H73DD2DF7, &HC4ABCE8D,&H961EBDCC, &H800042AF ' 124!
      !dd &H2325FEE4, &HF80FC7B6,&H929A0559, &H800042B6 ' 125!
      !dd &H4A9966E8, &H902F8897,&H904F9D44, &H800042BD ' 126!
      !dd &H1C04341A, &H070F2986,&H8F2EFE0A, &H800042C4 ' 127!
      !dd &H1C04341A, &H070F2986,&H8F2EFE0A, &H800042CB ' 128!
      !dd &H283C3C82, &H1B1D47D9,&H904D5C06, &H800042D2 ' 129!
      !dd &H8CDD2D75, &H3389BCF8,&H928E9176, &H800042D9 ' 130!
      !dd &H602A5C85, &HF8BEF766,&H95FDE8DE, &H800042E0 ' 131!
      !dd &H932BAF69, &HF084EF21,&H9AADD825, &H800042E7 ' 132!
      !dd &HE2EB6444, &H6BEA2078,&HA0B8A297, &H800042EE ' 133!
      !dd &H8D8E6CF7, &H84F919FE,&HA8414A36, &H800042F5 ' 134!
      !dd &H794C36EC, &H803EB96A,&HB174DC45, &H800042FC ' 135!
      !dd &H20E0FA5B, &HD842A501,&HBC8C2A09, &H80004303 ' 136!
      !dd &H3530CBF5, &H8977549B,&HC9CE04FE, &H8000430A ' 137!
      !dd &H55589BE4, &H6C34A737,&HD9921D62, &H80004311 ' 138!
      !dd &H16AE394A, &HE1812D96,&HEC44ABE8, &H80004318 ' 139!
      !dd &H14674755, &H5B52A4EE,&H81358E03, &H80004320 ' 140!
      !dd &H4279C493, &HB29909AE,&H8E54FE6F, &H80004327 ' 141!
      !dd &H51BF1613, &HEA21C6BD,&H9DE64A43, &H8000432E ' 142!
      !dd &H81537AA9, &HDF91BC07,&HB06746F7, &H80004335 ' 143!
      !dd &H717DE9FF, &HDB83F388,&HC6742FD6, &H8000433C ' 144!
      !dd &H9090A312, &H64AB79E0,&HE0CF9E31, &H80004343 ' 145!
      !dd &H12727D01, &H2B69CB82,&H80366838, &H8000434B ' 146!
      !dd &H612F7B8F, &H81DB7FB7,&H933E7BB0, &H80004352 ' 147!
      !dd &H085EE6DD, &H1625CBAC,&HAA403F04, &H80004359 ' 148!
      !dd &H41BE78BD, &HC1C7FF16,&HC62EC95A, &H80004360 ' 149!
      !dd &H150B357E, &H5B165EEE,&HE83ED3F6, &H80004367 ' 150!
      !dd &H6E699C8D, &H4FBA31FE,&H88FD0F06, &H8000436F ' 151!
      !dd &H231D69E8, &H7EAD1B5E,&HA2AC81D7, &H80004376 ' 152!
      !dd &H85F92897, &H956AEAB6,&HC2723333, &H8000437D ' 153!
      !dd &H992FC4D5, &H0FC4A263,&HE9F1659A, &H80004384 ' 154!
      !dd &H4DBFEC2D, &H478C0E52,&H8DA52884, &H8000438C ' 155!
      !dd &H4EC1E7D7, &H3732B174,&HACA14961, &H80004393 ' 156!
      !dd &HA899D65E, &H3DB42DA8,&HD3BDD401, &H8000439A ' 157!
      !dd &H180EF24E, &HC415342E,&H82AF28D8, &H800043A2 ' 158!
      !dd &H41E290FD, &H439256D1,&HA25594BD, &H800043A9 ' 159!
      !dd &H925B353C, &H9476EC85,&HCAEAF9EC, &H800043B0 ' 160!
      !dd &H0216B8F5, &H92BD9580,&HFF3B8E5B, &H800043B7 ' 161!
      !dd &H0152610B, &HF2DBF89B,&HA183B015, &H800043BF ' 162!
      !dd &H63AEE794, &HF3441E95,&HCDADB23B, &H800043C6 ' 163!
      !dd &HB3DC0C5B, &H67D7A397,&H83C3462E, &H800043CE ' 164!
      !dd &H8DD9A7ED, &HD1DBF8E1,&HA9D9B877, &H800043D5 ' 165!
      !dd &H83F645C8, &H642946C4,&HDC465B3B, &H800043DC ' 166!
      !dd &H3215A785, &HBE56ED2A,&H8FB1E583, &H800043E4 ' 167!
      !dd &H61BC6BDF, &HE9D21747,&HBC997D3C, &H800043EB ' 168!
      !dd &H3F0AC66D, &H6CB762BC,&HF902A75A, &H800043F2 ' 169!
      !dd &H01DD27C4, &H0C31C791,&HA55BC322, &H800043FA ' 170!
      ' Limit of double-precision
      !dd &HB87D7320, &H7C4A809B,&HDCE896AF, &H80004401 ' 171!
      !dd &H9FF44959, &HE7820E68,&H946C453D, &H80004409 ' 172!
      !dd &H68302B23, &HAAE5C779,&HC89A5595, &H80004410 ' 173!
      !dd &H84D0BD52, &HBA282D94,&H8858E62B, &H80004418 ' 174!
      !dd &H0D9562D6, &HC882EE51,&HBA698AAF, &H8000441F ' 175!
      !dd &HB956B3F3, &HD9DA03D7,&H80288F58, &H80004427 ' 176!
      !dd &H4E49E4D6, &HDD3F7950,&HB1381638, &H8000442E ' 177!
      !dd &HACDEC23A, &H13AC44B3,&HF671FEE7, &H80004435 ' 178!
      !dd &HA1DFC1CE, &H92C17409,&HAC51B53B, &H8000443D ' 179!
      !dd &H8BA2A88A, &HC6600B2D,&HF252E6DB, &H80004444 ' 180!
      !dd &H33BA012A, &H6341E7E7,&HAB549D39, &H8000444C ' 181!
      !dd &HBD8C79A7, &H9921B5BC,&HF39C4F8D, &H80004453 ' 182!
      !dd &HEB7F6AF6, &H387718E9,&HAE24BCDE, &H8000445B ' 183!
      !dd &H428729C2, &H712B33D0,&HFA54CF7F, &H80004462 ' 184!
      !dd &H8013AD2D, &H18C83871,&HB4E749F3, &H8000446A ' 185!
      !dd &H770E4BD3, &HA0017902,&H83700BBA, &H80004472 ' 186!
      !dd &H99EEE2C6, &HA5C226C9,&HC005B122, &H80004479 ' 187!
      !dd &H0D0B6E8A, &H71BA947C,&H8D042E15, &H80004481 ' 188!
      !dd &H2B42E137, &HA9ED7F3F,&HD0382C0B, &H80004488 ' 189!
      !dd &HE21BA327, &HA81E4470,&H9A89B0B0, &H80004490 ' 190!
      !dd &H71653D74, &H9ADD2A20,&HE69975A7, &H80004497 ' 191!
      !dd &H550BEE17, &HB425DF98,&HACF3183D, &H8000449F ' 192!
      !dd &HD81DFE7F, &H84D08D91,&H82634546, &H800044A7 ' 193!
      !dd &H0B8D75B9, &HE14C1691,&HC59E74FE, &H800044AE ' 194!
      !dd &H7BCCC0AC, &H259CF530,&H9687B31E, &H800044B6 ' 195!
      !dd &H3D918707, &H29985772,&HE67FCA46, &H800044BD ' 196!
      !dd &HE960FCE9, &HFE023B4A,&HB16056A7, &H800044C5 ' 197!
      !dd &HF081039C, &HEE75B9DB,&H89308305, &H800044CD ' 198!
      !dd &HEFE8939C, &H38BB06F3,&HD5496BB3, &H800044D4 ' 199!
      !dd &H936DB352, &H04521D6E,&HA6A15C24, &H800044DC ' 200!
      !dd &HD1C121CC, &H4764791B,&H82D4B158, &H800044E4 ' 201!
      !dd &HE704C955, &H50AA8F1F,&HCE77A7DF, &H800044EB ' 202!
      !dd &H4C30CBA7, &H14F73F7E,&HA3B8E21E, &H800044F3 ' 203!
      !dd &HA4B6E249, &HF8B50698,&H8277542F, &H800044FB ' 204!
      !dd &H77CCE669, &HD451EC90,&HD0F31CD4, &H80004502 ' 205!
      !dd &H4066E168, &H42D9EC5C,&HA823A133, &H8000450A ' 206!
      !dd &H98133043, &H730E361E,&H87F4CF58, &H80004512 ' 207!
      !dd &HB71F2E6D, &HBAF717F1,&HDCEDD0EF, &H80004519 ' 208!
      !dd &H568074E7, &HB7A3BA8C,&HB45E2793, &H80004521 ' 209!
      !dd &H1EF55FE6, &H2CA44F07,&H93F53C77, &H80004529 ' 210!
      !dd &HBD087C14, &H7396DA45,&HF3E641AC, &H80004530 ' 211!
      !dd &HC08B06C1, &HCFB8ECC1,&HC9FAAE62, &H80004538 ' 212!
      !dd &H3533AC9F, &H36D4DCFD,&HA80D9318, &H80004540 ' 213!
      !dd &HAA79324D, &H3DD5F0BB,&H8C7B58F6, &H80004548 ' 214!
      !dd &H3857927D, &H9BDD5A5B,&HEBF72F6D, &H8000454F ' 215!
      !dd &HF789E399, &H7B82C43C,&HC7189004, &H80004557 ' 216!
      !dd &HADD3E1ED, &HCCB1D857,&HA8C3D213, &H8000455F ' 217!
      !dd &HAA066E64, &HDC4F723A,&H8FB6C0E4, &H80004567 ' 218!
      !dd &H5EE700DE, &H90EFED70,&HF5E2AE07, &H8000456E ' 219!
      !dd &H918E84BF, &H808E300C,&HD34ECD8E, &H80004576 ' 220!
      !dd &HD9A80899, &H04FABF7A,&HB66B0774, &H8000457E ' 221!
      !dd &H88BFB775, &H9C51720C,&H9E30D076, &H80004586 ' 222!
      !dd &HEB1F00CF, &H522AF258,&H89CC8597, &H8000458E ' 223!
      !dd &H9B76416A, &HCFCB281B,&HF125E9C8, &H80004595 ' 224!
      !dd &H43A2EF7E, &H7EA18E40,&HD3F25279, &H8000459D ' 225!
      !dd &HBBB5D76D, &H41CA9F94,&HBB1BECCF, &H800045A5 ' 226!
      !dd &HE2723E06, &HC756AB80,&HA5E9C2FB, &H800045AD ' 227!
      !dd &HC9ADBF3D, &H3D8930BE,&H93C431A8, &H800045B5 ' 228!
      !dd &HAA686C12, &H7F0BB89A,&H842E806B, &H800045BD ' 229!
      !dd &HEA33A230, &H28490FB5,&HED838EC1, &H800045C4 ' 230!
      !dd &H26549759, &H4B59ED2D,&HD651B5D0, &H800045CC ' 231!
      !dd &HEABCA929, &HC4497EF0,&HC23A0CC4, &H800045D4 ' 232!
      !dd &H45A5B5F6, &H16A6E489,&HB0C6D59F, &H800045DC ' 233!
      !dd &H79A97853, &H6AB48CE5,&HA195BF43, &H800045E4 ' 234!
      !dd &HA6AE9174, &HE2F3BD56,&H94547692, &H800045EC ' 235!
      !dd &HE1A8EE17, &H6938B28B,&H88BDDD4F, &H800045F4 ' 236!
      !dd &HFFD2C8D7, &H08D2FA96,&HFD2F8BC5, &H800045FB ' 237!
      !dd &H61D5F6B8, &H2E3424F8,&HEB6233F1, &H80004603 ' 238!
      !dd &HE356C155, &H2A22AE83,&HDBC0AE7E, &H8000460B ' 239!
      !dd &HA5215540, &H4780839B,&HCE04A396, &H80004613 ' 240!
      !dd &H86746141, &H794FFBE5,&HC1F25E00, &H8000461B ' 241!
      !dd &HF91A03F0, &H72AD9C1E,&HB7571CDC, &H80004623 ' 242!
      !dd &H6673B1BD, &H40DACB31,&HAE07B065, &H8000462B ' 243!
      !dd &H15A64568, &H81D089AB,&HA5DF5420, &H80004633 ' 244!
      !dd &HBBB8206C, &H1C3C93C0,&H9EBEBB83, &H8000463B ' 245!
      !dd &H3462EF28, &HFD2235FB,&H988B482F, &H80004643 ' 246!
      !dd &H5F8B74C0, &H4D3C0215,&H932E62A6, &H8000464B ' 247!
      !dd &HB48F191A, &H1AD22204,&H8E94EF91, &H80004653 ' 248!
      !dd &H939F2F6A, &H23166316,&H8AAEDD04, &H8000465B ' 249!
      !dd &H0C29744D, &H0A43DCC4,&H876EC3D6, &H80004663 ' 250!
      !dd &H37ECA508, &HDC108974,&H84C99A02, &H8000466B ' 251!
      !dd &H670CF274, &HD0A0474E,&H82B6739A, &H80004673 ' 252!
      !dd &H7BD7CB9C, &H002E6678,&H812E5040, &H8000467B ' 253!
      !dd &H8AE01C05, &H802E09AB,&H802BF39F, &H80004683 ' 254!
      !dd &HBEAA77D2, &HC15BB743,&HFF578F57, &H8000468A ' 255!
      !dd &HBEAA77D2, &HC15BB743,&HFF578F57, &H80004692 ' 256!
      !dd &H81349125, &H8C8E897D,&H802B7373, &H8000469B ' 257!
      !dd &H7C36FA47, &H73A7A690,&H812BCA5A, &H800046A3 ' 258!
      !dd &H2DAB9F36, &H83029D84,&H82AF4DB9, &H800046AB ' 259!
      !dd &H3E624DB3, &H690EA7FA,&H84BA0AF0, &H800046B3 ' 260!
      !dd &H219A3938, &H1B1BF142,&H8751AD27, &H800046BB ' 261!
      !dd &HAE63D68F, &H05BE98E9,&H8A7D9736, &H800046C3 ' 262!
      !dd &H1228916D, &H7FE6CF18,&H8E470658, &H800046CB ' 263!
      !dd &HD2B9D5F8, &H43E60590,&H92B93E8B, &H800046D3 ' 264!
      !dd &HEA225E7E, &H29491BC2,&H97E1C1BE, &H800046DB ' 265!
      !dd &H8747B62F, &H96E5F6D8,&H9DD0934F, &H800046E3 ' 266!
      !dd &HD517CB03, &H0261D873,&HA49889A4, &H800046EB ' 267!
      !dd &H4314E887, &HB27E6E99,&HAC4FB017, &H800046F3 ' 268!
      !dd &H0B7CF856, &HE68EDA37,&HB50FBC08, &H800046FB ' 269!
      !dd &H0E1DCDEB, &H632AAA26,&HBEF69851, &H80004703 ' 270!
      !dd &H48F18CFB, &H27FA2A1E,&HCA270B3E, &H8000470B ' 271!
      !dd &H2D80A5CB, &H0A79CCC0,&HD6C97BF2, &H80004713 ' 272!
      !dd &HF08630CE, &H1D2BE358,&HE50CDD2D, &H8000471B ' 273!
      !dd &H316FA03C, &H4938F955,&HF527C4BA, &H80004723 ' 274!
      !dd &H420D7490, &H0E5419EB,&H83ACDC2A, &H8000472C ' 275!
      !dd &HA33681AB, &H5772ABF1,&H8DF65D5D, &H80004734 ' 276!
      !dd &H7599FA4F, &HFF9F140C,&H999B9305, &H8000473C ' 277!
      !dd &H87B535D1, &H8396BFC5,&HA6CEF1A8, &H80004744 ' 278!
      !dd &H46E67DA7, &HA7694B00,&HB5CB895E, &H8000474C ' 279!
      !dd &H4D8C196F, &H871B2A08,&HC6D69E3F, &H80004754 ' 280!
      !dd &H1D1EC7EB, &HBB4CD123,&HDA4193B3, &H8000475C ' 281!
      !dd &HAE13E838, &HFC529E60,&HF06C3CB3, &H80004764 ' 282!
      !dd &H703800DB, &H7BF7AA8A,&H84E3D38D, &H8000476D ' 283!
      !dd &H947E20F3, &HF586C131,&H936CBEB0, &H80004775 ' 284!
      !dd &H32506AAF, &H01570514,&HA420104B, &H8000477D ' 285!
      !dd &H9035D72F, &HCB7F37AC,&HB75BD233, &H80004785 ' 286!
      !dd &H75AC5C3E, &H11239F6A,&HCD8FF0A8, &H8000478D ' 287!
      !dd &HC461E7C6, &H13481357,&HE741EEBD, &H80004795 ' 288!
      !dd &H0A594353, &HB9622EEB,&H8288B741, &H8000479E ' 289!
      !dd &H41B91E44, &H74013926,&H93DEDF98, &H800047A6 ' 290!
      !dd &H7CB56D67, &H4BDD63F6,&HA816582A, &H800047AE ' 291!
      !dd &H263EF0CA, &H3E888605,&HBFB97C90, &H800047B6 ' 292!
      !dd &HE4C60997, &H17924163,&HDB6F4B91, &H800047BE ' 293!
      !dd &HB8BB6F04, &HA111F718,&HFC01D0C8, &H800047C6 ' 294!
      !dd &HBE6FFE77, &H98CDD9DE,&H91330BCB, &H800047CF ' 295!
      !dd &H8C317E39, &H68AE03E9,&HA7E305A3, &H800047D7 ' 296!
      !dd &HF3A56B70, &H9471E289,&HC2C6618A, &H800047DF ' 297!
      !dd &H959E8F11, &H50CC91B4,&HE2BAED8B, &H800047E7 ' 298!
      !dd &HF560188C, &HDBAF7716,&H846829B8, &H800047F0 ' 299!
      !dd &HE78C9CC4, &HA1719F8E,&H9B2A10E4, &H800047F8 ' 300!
      !dd &H06405453, &HD1D2989B,&HB67075DC, &H80004800 ' 301!
      !dd &HE15FE37A, &H7F867006,&HD738AB0A, &H80004808 ' 302!
      !dd &H24C07E3D, &H6CF01E98,&HFEBC1271, &H80004810 ' 303!
      !dd &H55D24AF4, &H58AE922A,&H973FAAF3, &H80004819 ' 304!
      !dd &H703F8B4D, &HECA7FC24,&HB432DAAB, &H80004821 ' 305!
      !dd &H8E2BF482, &H80E0CB63,&HD764C961, &H80004829 ' 306!
      !dd &H31BF5B1C, &HF6C6C9F4,&H8126EEBF, &H80004832 ' 307!
      !dd &HCBDA399E, &HF4E72AF9,&H9B62D73E, &H8000483A ' 308!
      !dd &H830E678B, &HFD9B06DF,&HBB8E4DCE, &H80004842 ' 309!
      !dd &HA8B37163, &HA719BA52,&HE31E5238, &H8000484A ' 310!
      !dd &H3578FF5F, &H698020AD,&H89F4EAF1, &H80004853 ' 311!
      !dd &H192B773C, &H389427D3,&HA8227E56, &H8000485B ' 312!
      !dd &H19C624C9, &H6B2D24B1,&HCD922C77, &H80004863 ' 313!
      !dd &H399D091E, &H79755F01,&HFC254A8A, &H8000486B ' 314!
      !dd &H40F21D1C, &H31B9B5F3,&H9B20F15C, &H80004874 ' 315!
      !dd &H442ADBEF, &HCD613C98,&HBF7CA9ED, &H8000487C ' 316!
      !dd &H8C691257, &H77516808,&HED1D5E6B, &H80004884 ' 317!
      !dd &H4F354264, &HBF1B8F9D,&H93453DA4, &H8000488D ' 318!
      !dd &H05B35DBA, &H4A2357F5,&HB78347D0, &H80004895 ' 319!
      !dd &H47203529, &H5CAC2DF2,&HE56419C4, &H8000489D ' 320!
      !dd &H6597B154, &H9C19F2CE,&H8FD14227, &H800048A6 ' 321!
      !dd &H9BC8CD0C, &HD258A367,&HB4E53535, &H800048AE ' 322!
      !dd &HB98E5AB6, &HE865D62B,&HE43D3222, &H800048B6 ' 323!
      !dd &HAB6C1567, &H17107187,&H906EB9BA, &H800048BF ' 324!
      !dd &H3CA0372C, &H3F47E021,&HB75C91C9, &H800048C7 ' 325!
      !dd &H53340642, &H4695876A,&HE97FE1A6, &H800048CF ' 326!
      !dd &H6823B9FF, &HB2147FFC,&H95212C9D, &H800048D8 ' 327!
      !dd &H656DC64F, &H0C2A43FB,&HBF12812A, &H800048E0 ' 328!
      !dd &H155A13DB, &H09A2515E,&HF58EC7FF, &H800048E8 ' 329!
      !dd &HA3C30ECC, &H61359E71,&H9E4506E7, &H800048F1 ' 330!
      !dd &HEEBD3422, &H2AB053DC,&HCCA33FED, &H800048F9 ' 331!
      !dd &H42CEAFCE, &HC9AE5661,&H84B1DB73, &H80004902 ' 332!
      !dd &H83E6DAAF, &H9D57C65C,&HAC9B5A75, &H8000490A ' 333!
      !dd &HB4173151, &H734884CC,&HE132B005, &H80004912 ' 334!
      !dd &HEFD52CC4, &H90EDF2E3,&H9358AA2B, &H8000491B ' 335!
      !dd &H2AC7CAC2, &H2E384ECB,&HC1645F59, &H80004923 ' 336!
      !dd &H735101E9, &H65D81FB9,&HFE952184, &H8000492B ' 337!
      !dd &H6D207A43, &H673BACF1,&HA8107320, &H80004934 ' 338!
      !dd &HB38201E6, &HE8B40603,&HDE8DC873, &H8000493C ' 339!
      !dd &H75345543, &HF8878BFE,&H93CA271C, &H80004945 ' 340!
      !dd &HF21EB592, &H970C8D79,&HC4DC4619, &H8000494D ' 341!
      !dd &H74BA8349, &H17E56280,&H837F22D3, &H80004956 ' 342!
      !dd &H1C65E5E6, &HD50456FA,&HB02F57A8, &H8000495E ' 343!
      !dd &H1628ECED, &HDE3DD4E0,&HECBF9DCA, &H80004966 ' 344!
      !dd &HFEEE93A6, &H32C0A9F0,&H9F871DD3, &H8000496F ' 345!
      !dd &HB88E738E, &H729865AF,&HD79C9E4F, &H80004977 ' 346!
      !dd &H97948B51, &HD82A48EA,&H9220A54A, &H80004980 ' 347!
      !dd &HE60DED62, &HBDD97B1E,&HC6A460B1, &H80004988 ' 348!
      !dd &H8FD07E4F, &H27E8BE6C,&H87670BE9, &H80004991 ' 349!
      !dd &H6C9F0CB1, &HC4903458,&HB91EE248, &H80004999 ' 350!
      !dd &H3CEE1266, &HC581B7C5,&HFDD15841, &H800049A1 ' 351!
      !dd &H99E3ACA6, &H37C92E57,&HAE7FECAD, &H800049AA ' 352!
      !dd &HCB32F111, &HD9EC68E6,&HF09E655A, &H800049B2 ' 353!
      !dd &H927E38AD, &HD0AC7487,&HA65D8413, &H800049BB ' 354!
      !dd &H00250898, &H7A5F2598,&HE6B3AE27, &H800049C3 ' 355!
      !dd &HB019BFF9, &H73162823,&HA068EF17, &H800049CC ' 356!
      !dd &HC493E8B7, &HB37DE5F9,&HDFB2556B, &H800049D4 ' 357!
      !dd &HA4736BB8, &H4E8107CD,&H9C69B1BA, &H800049DD ' 358!
      !dd &H619DDC0F, &H4416F1F1,&HDB58383C, &H800049E5 ' 359!
      !dd &HB8A2FEBA, &H5FE0221D,&H9A3A078A, &H800049EE ' 360!
      !dd &HE95DD935, &H2133101B,&HD97BD4A2, &H800049F6 ' 361!
      !dd &HBBFF5A92, &HA1791A63,&H99C48D56, &H800049FF ' 362!
      !dd &H6B93156E, &HD6F6B86B,&HDA09B469, &H80004A07 ' 363!
      !dd &H5E7A913C, &H3ED3671C,&H9B02E643, &H80004A10 ' 364!
      !dd &H72B4C112, &HE0936A03,&HDD03224D, &H80004A18 ' 365!
      !dd &H76FF3604, &HAB8960C8,&H9DFD3D85, &H80004A21 ' 366!
      !dd &H6297DE70, &HA0E9F1BF,&HE27E0B32, &H80004A29 ' 367!
      !dd &H8EDD27E0, &H63A825C1,&HA2CA980C, &H80004A32 ' 368!
      !dd &HFEECC67B, &HDBA55E6B,&HEAA60529, &H80004A3A ' 369!
      !dd &H0B391B6F, &H3FBA813C,&HA991F9BB, &H80004A43 ' 370!
      !dd &H0443C2C1, &H5D5B494A,&HF5BE8CEA, &H80004A4B ' 371!
      !dd &HC7193B80, &H47D4533F,&HB28C7262, &H80004A54 ' 372!
      !dd &HF68BE1D9, &H99542EA5,&H82135154, &H80004A5D ' 373!
      !dd &H76305BF3, &H9800FC26,&HBE0838D1, &H80004A65 ' 374!
      !dd &H2B906B59, &H82D4B8AE,&H8B2F059D, &H80004A6E ' 375!
      !dd &HCFFC1DAA, &H58286F3F,&HCC6D103F, &H80004A76 ' 376!
      !dd &H7CA523D8, &HA469C5EA,&H96864E76, &H80004A7F ' 377!
      !dd &H3C0BD6EC, &H2EC42E3C,&HDE424FDB, &H80004A87 ' 378!
      !dd &H9672C398, &HBF1E3839,&HA486161C, &H80004A90 ' 379!
      !dd &H7B525A56, &HABB0DB75,&HF43708D2, &H80004A98 ' 380!
      !dd &HEC44C839, &HC4C31B4E,&HB5BAF410, &H80004AA1 ' 381!
      !dd &HE2475162, &H82CD915F,&H87967C18, &H80004AAA ' 382!
      !dd &H7388B2C2, &HABB18C7E,&HCADA23A8, &H80004AB2 ' 383!
      !dd &HD6A68612, &H80C5295E,&H98239ABE, &H80004ABB ' 384!
      !dd &HA0D06FA1, &H7FA88337,&HE4CD8BB8, &H80004AC3 ' 385!
      !dd &HF03D2428, &H183E0AEC,&HAC7EF656, &H80004ACC ' 386!
      !dd &H179636D4, &H1352E542,&H8261F732, &H80004AD5 ' 387!
      !dd &H2BBFAB1A, &HE549A378,&HC59C7AA7, &H80004ADD ' 388!
      !dd &HCD3D1F7F, &H8FB472B2,&H96236330, &H80004AE6 ' 389!
      !dd &H64AB1DFB, &HFAECE6BC,&HE4B9E91B, &H80004AEE ' 390!
      !dd &HDEE0AD66, &HDE1FEA34,&HAEABF984, &H80004AF7 ' 391!
      !dd &H7AA404C2, &HBA106F50,&H85BBAB09, &H80004B00 ' 392!
      !dd &H8C45CB4D, &HEEA33AE2,&HCD4D1991, &H80004B08 ' 393!
      !dd &H55F1B573, &H4CA39C50,&H9DFC54AD, &H80004B11 ' 394!
      !dd &HF49BF2F8, &H6540722F,&HF3C456A7, &H80004B19 ' 395!
      !dd &H17309DEC, &H784FD851,&HBC89DB05, &H80004B22 ' 396!
      !dd &HE07B3273, &HBDC9E93A,&H9230E453, &H80004B2B ' 397!
      !dd &H88FF886F, &H310FE899,&HE34802FA, &H80004B33 ' 398!
      !dd &HA64322D3, &HF93BE5C3,&HB11E9E51, &H80004B3C ' 399!
      !dd &HD9E47335, &H0AB6CB80,&H8A5FEBB0, &H80004B45 ' 400!
      !dd &HD54ED875, &HC0C854C4,&HD8C0402E, &H80004B4D ' 401!
      !dd &H8B7AE7F4, &HB55D4A8E,&HAA2EF264, &H80004B56 ' 402!
      !dd &H32C93D93, &H44C0EE2F,&H85F3F3CA, &H80004B5F ' 403!
      !dd &H7C25952B, &H348077E2,&HD364FCBB, &H80004B67 ' 404!
      !dd &HA733BA7F, &H15079ED4,&HA73761EA, &H80004B70 ' 405!
      !dd &HA09604E3, &H9EAD0AF2,&H8498EAA4, &H80004B79 ' 406!
      !dd &HBD4E81C4, &HB8451C67,&HD2CF1D0B, &H80004B81 ' 407!
      !dd &HAADA8F68, &H56D712A2,&HA7FD0B25, &H80004B8A ' 408!
      !dd &HF17B978F, &H53DECE62,&H8631A367, &H80004B93 ' 409!
      !dd &H76BFF0BB, &H7C52D68A,&HD6EB7FB3, &H80004B9B ' 410!
      !dd &H265313BE, &H944C7F38,&HAC860B02, &H80004BA4 ' 411!
      !dd &H2ED6D9E3, &H13558E5F,&H8AD3DCDC, &H80004BAD ' 412!
      !dd &H8E909D83, &H0B3106AF,&HDFF7CB4F, &H80004BB5 ' 413!
      !dd &HF446EF5D, &HEA0CA467,&HB5195D64, &H80004BBE ' 414!
      !dd &H427F7F04, &H4BB53F42,&H92CA0F33, &H80004BC7 ' 415!
      !dd &HAC0F2E66, &H5B0686CB,&HEE8858B3, &H80004BCF ' 416!
      !dd &HE1A25D4A, &H13A2D0C8,&HC2460C3E, &H80004BD8 ' 417!
      !dd &H00358E2A, &HAE07EC74,&H9E9B2FFE, &H80004BE1 ' 418!
      !dd &HEE2BD3D7, &HEB6B7C00,&H81CBFFC6, &H80004BEA ' 419!
      !dd &H86BFE78D, &H5A3C5771,&HD4F2AFA2, &H80004BF2 ' 420!
      !dd &HD94CCBE5, &HFF329DE6,&HAF198D6A, &H80004BFB ' 421!
      !dd &H451A4C0E, &H3056B825,&H90520F8F, &H80004C04 ' 422!
      !dd &H952E73AB, &H98DF4A45,&HEE7797B5, &H80004C0C ' 423!
      !dd &H9F8A77CA, &H6298E981,&HC57B09A2, &H80004C15 ' 424!
      !dd &H18EE706F, &H4AD7EDD4,&HA3ECA17F, &H80004C1E ' 425!
      !dd &H78BE638C, &HE945A8E1,&H8863E25E, &H80004C27 ' 426!
      !dd &H1465900B, &H4F1730B0,&HE37E9A94, &H80004C2F ' 427!
      !dd &H310CE669, &HFA1D62B3,&HBE2BD537, &H80004C38 ' 428!
      !dd &H24994F0F, &H67119F33,&H9F57BA27, &H80004C41 ' 429!
      !dd &HF3BCC166, &H178FCCB3,&H85D2AD57, &H80004C4A ' 430!
      !dd &HF75AC99A, &HA0AB19A2,&HE14DB1D5, &H80004C52 ' 431!
      !dd &H80B49A1A, &H3F905DA1,&HBE198E0C, &H80004C5B ' 432!
      !dd &H1558BC53, &H5BC1972F,&HA0C49CA1, &H80004C64 ' 433!
      !dd &HE91837A2, &HC6C71926,&H8846A8C4, &H80004C6D ' 434!
      !dd &H1E142689, &H5DC44FBD,&HE79010C6, &H80004C75 ' 435!
      !dd &H0B9D28D1, &HEBD92BE7,&HC530AE48, &H80004C7E ' 436!
      !dd &HB369A356, &H3D4CDBF8,&HA84E0CC1, &H80004C87 ' 437!
      !dd &HC17B5EBB, &H4F70C02D,&H8FFAC4E9, &H80004C90 ' 438!
      !dd &H76CA8F72, &H173A598E,&HF6E707AC, &H80004C98 ' 439!
      !dd &H6E161346, &HE3F624F6,&HD42E8A97, &H80004CA1 ' 440!
      !dd &H41D2039A, &HD3D982D6,&HB6C2165F, &H80004CAA ' 441!
      !dd &HF6D24D1C, &HB9E2C5F2,&H9DC58D50, &H80004CB3 ' 442!
      !dd &HB88EF5B8, &H58D5B645,&H88826DC5, &H80004CBC ' 443!
      !dd &HEC17F22A, &H4612A820,&HECC23662, &H80004CC4 ' 444!
      !dd &H9D32CFFA, &H69E73720,&HCDC6CC44, &H80004CCD ' 445!
      !dd &H68EF432B, &H98406905,&HB3402BEF, &H80004CD6 ' 446!
      !dd &H391CE324, &HAD6C3BB0,&H9C7E865B, &H80004CDF ' 447!
      !dd &H31F946BF, &H37BEB43A,&H88EEB590, &H80004CE8 ' 448!
      !dd &H11A63515, &HF1C57A1A,&HF02AAC71, &H80004CF0 ' 449!
      !dd &HE98314A8, &H257E9050,&HD3158190, &H80004CF9 ' 450!
      !dd &H45B0F6B2, &H7906FC1F,&HB9EF71A0, &H80004D02 ' 451!
      !dd &H9B8639C9, &HAAD82A93,&HA425624F, &H80004D0B ' 452!
      !dd &H991A4220, &H7CA841AB,&H913B137B, &H80004D14 ' 453!
      !dd &H28C248A3, &H7F89323B,&H80C76246, &H80004D1D ' 454!
      !dd &H25714F19, &H4CACD847,&HE4E25FAB, &H80004D25 ' 455!
      !dd &H5D58EA72, &H9049F09F,&HCBD99D34, &H80004D2E ' 456!
      !dd &H3ED1DD43, &H6AC9FF46,&HB5F3BCD1, &H80004D37 ' 457!
      !dd &HD631BAED, &H5486B159,&HA2C307E7, &H80004D40 ' 458!
      !dd &H09859513, &HE246BFFE,&H91E9D795, &H80004D49 ' 459!
      !dd &H3C8E03F0, &HA94B907E,&H831817B0, &H80004D52 ' 460!
      !dd &H530BBD16, &H20DD1333,&HEC1262A9, &H80004D5A ' 461!
      !dd &H4FEF979F, &H9CA77C53,&HD5049706, &H80004D63 ' 462!
      !dd &H56C9299C, &H7AA974ED,&HC0A1A692, &H80004D6C ' 463!
      !dd &H16A64DB6, &HBF2991F7,&HAE927EF4, &H80004D75 ' 464!
      !dd &HE8120994, &H479D4110,&H9E8C0C4D, &H80004D7E ' 465!
      !dd &H63386AB7, &H562E2038,&H904D7732, &H80004D87 ' 466!
      !dd &H6E7FF556, &H699B1263,&H839EA838, &H80004D90 ' 467!
      !dd &HC601EC82, &H210F7D9D,&HF09E0B87, &H80004D98 ' 468!
      !dd &H05E0C325, &H47C8B091,&HDC68C58F, &H80004DA1 ' 469!
      !dd &H20655323, &H86E53A15,&HCA542D5A, &H80004DAA ' 470!
      !dd &H6F4D35FA, &HC717DEEE,&HBA206FB8, &H80004DB3 ' 471!
      !dd &HCE9B2DC3, &H578A0183,&HAB95E6FE, &H80004DBC ' 472!
      !dd &H445E5BC6, &HF7DEFE66,&H9E83FBE5, &H80004DC5 ' 473!
      !dd &HAD4B5AF7, &HE6797184,&H92C03033, &H80004DCE ' 474!
      !dd &H96C568E4, &H2651AAD0,&H88254CB8, &H80004DD7 ' 475!
      !dd &HD8570F08, &H673FD99B,&HFD255AA6, &H80004DDF ' 476!
      !dd &HB10D1B81, &H0730FC3B,&HEBD74CF4, &H80004DE8 ' 477!
      !dd &HBA4B3CAD, &HD2B6BB7B,&HDC2E00D7, &H80004DF1 ' 478!
      !dd &H40C96344, &HE9A1F466,&HCDFD09C9, &H80004DFA ' 479!
      !dd &HDCBCCD10, &H4B07D51F,&HC11D392D, &H80004E03 ' 480!
      !dd &H6EDF5EA5, &H0CFCDBB8,&HB56BF437, &H80004E0C ' 481!
      !dd &HA060481A, &HD33A0AD8,&HAACAA0E7, &H80004E15 ' 482!
      !dd &H5B4AD404, &HB1C3413B,&HA11E26CA, &H80004E1E ' 483!
      !dd &H1C4CBC6C, &H9C0A93AA,&H984E80AB, &H80004E27 ' 484!
      !dd &HA3CEB07C, &H8F5004E0,&H90465CE2, &H80004E30 ' 485!
      !dd &H3B7D3186, &H0E08F4A1,&H88F2CA2B, &H80004E39 ' 486!
      !dd &H5C15949B, &HF3D984AF,&H8242EF4B, &H80004E42 ' 487!
      !dd &H47892347, &HC8D6A4EE,&HF84F9828, &H80004E4A ' 488!
      !dd &H93527A32, &HF3D10085,&HED2804D2, &H80004E53 ' 489!
      !dd &HD5FDEEF1, &HE357057F,&HE2F74C9D, &H80004E5C ' 490!
      !dd &H17B704A5, &H6983F3C6,&HD9A827F9, &H80004E65 ' 491!
      !dd &H5AC9DE76, &HAB64CC40,&HD1279669, &H80004E6E ' 492!
      !dd &HF76B60B5, &HBF888EAB,&HC9649E54, &H80004E77 ' 493!
      !dd &HEBB89A4E, &HC4CCC1A7,&HC25014C3, &H80004E80 ' 494!
      !dd &HD864F92F, &H44C3F539,&HBBDC6C13, &H80004E89 ' 495!
      !dd &H09A1D165, &HAA9DD590,&HB5FD88B2, &H80004E92 ' 496!
      !dd &H515993C3, &H6E9E35CE,&HB0A89B31, &H80004E9B ' 497!
      !dd &HAD2020B9, &H1497E255,&HABD3FEF3, &H80004EA4 ' 498!
      !dd &H803ACFE4, &HE8920716,&HA7771CF9, &H80004EAD ' 499!
      !dd &HF9396F05, &H0D1E9AEB,&HA38A524C, &H80004EB6 ' 500!
      !dd &HE75EB322, &H6AD67297,&HA006D987, &H80004EBF ' 501!
      !dd &HEFD9D9A2, &HC5C0425A,&H9CE6B747, &H80004EC8 ' 502!
      !dd &H56A2854F, &H02C66130,&H9A24A90F, &H80004ED1 ' 503!
      !dd &H9547FB3A, &HC6BB47AB,&H97BC166A, &H80004EDA ' 504!
      !dd &HBCBD7F4A, &H5103B830,&H95A9041C, &H80004EE3 ' 505!
      !dd &H2A8746CD, &HFC10AD08,&H93E8090F, &H80004EEC ' 506!
      !dd &H961CF49C, &H541A8357,&H927644F9, &H80004EF5 ' 507!
      !dd &HE6F0BAB2, &H61724E50,&H9151586F, &H80004EFE ' 508!
      !dd &H6D96519A, &HBA6022DB,&H90775E6A, &H80004F07 ' 509!
      !dd &H9228BB49, &H4FA5C2B8,&H8FE6E70C, &H80004F10 ' 510!
      !dd &H35DFA6EB, &HC97DEFD7,&H8F9EF398, &H80004F19 ' 511!
      !dd &H35DFA6EB, &HC97DEFD7,&H8F9EF398, &H80004F22 ' 512!
      !dd &H217A96BE, &H95E2AECF,&H8FE6C312, &H80004F2B ' 513!
      !dd &HF09C1155, &HA878917D,&H9076A9D5, &H80004F34 ' 514!
      !dd &H2D84FB6F, &H68F54658,&H914F5BD4, &H80004F3D ' 515!
      !dd &HDDE00566, &H11C730E4,&H9271FA8C, &H80004F46 ' 516!
      !dd &H1A0AB574, &H6FF3A2DF,&H93E0177E, &H80004F4F ' 517!
      !dd &HB758D594, &HEB437DC7,&H959BB7C4, &H80004F58 ' 518!
      !dd &HF25A8C7F, &H1C7AE9FF,&H97A758C8, &H80004F61 ' 519!
      !dd &HF223F6B1, &H3CECD5A7,&H9A05F62B, &H80004F6A ' 520!
      !dd &H65E59888, &HFF7EFF69,&H9CBB10FE, &H80004F73 ' 521!
      !dd &H74E31482, &HFA7C7A66,&H9FCAB853, &H80004F7C ' 522!
      !dd &HA865F573, &HC85E2707,&HA3399349, &H80004F85 ' 523!
      !dd &HD6585934, &H83105BF1,&HA70CECBD, &H80004F8E ' 524!
      !dd &H7A499778, &H52E44647,&HAB4AC0C0, &H80004F97 ' 525!
      !dd &H6EA19A9C, &H95288433,&HAFF9CC05, &H80004FA0 ' 526!
      !dd &HF05F56A3, &HBF073412,&HB5219D7F, &H80004FA9 ' 527!
      !dd &H87E25158, &HBCFF6DB3,&HBACAAA6B, &H80004FB2 ' 528!
      !dd &HFDE5550C, &H50C5E8D7,&HC0FE6514, &H80004FBB ' 529!
      !dd &H95D26509, &H079CDE07,&HC7C756A2, &H80004FC4 ' 530!
      !dd &HDDE1B3C9, &H0AE53044,&HCF313C59, &H80004FCD ' 531!
      !dd &H8E8C84CF, &H85522427,&HD74928B4, &H80004FD6 ' 532!
      !dd &H2DE54842, &HECCA02A3,&HE01DA8DF, &H80004FDF ' 533!
      !dd &H30DE225C, &H8BF6B0C0,&HE9BEEF21, &H80004FE8 ' 534!
      !dd &HD3101CE7, &H8DC045B0,&HF43F02DF, &H80004FF1 ' 535!
      !dd &H1CF4DE42, &H086548F5,&HFFB1F702, &H80004FFA ' 536!
      !dd &H8A6F698E, &HD0E71D82,&H861713C8, &H80005004 ' 537!
      !dd &H2B7711EB, &H0382DA02,&H8CE63FCA, &H8000500D ' 538!
      !dd &H48C1D95C, &H2AB24081,&H94546427, &H80005016 ' 539!
      !dd &H5ABC733F, &H4F080008,&H9C7101A1, &H8000501F ' 540!
      !dd &HD3E01FC7, &HF201F408,&HA54D6838, &H80005028 ' 541!
      !dd &H584A41A3, &H48301155,&HAEFCF154, &H80005031 ' 542!
      !dd &H0322C09D, &HE28EFA62,&HB99541F0, &H8000503A ' 543!
      !dd &H2354ECA6, &HF0B7EA08,&HC52E960F, &H80005043 ' 544!
      !dd &HA99BE5E7, &HF7BBC49D,&HD1E416BB, &H8000504C ' 545!
      !dd &H21DF402B, &H732F3CAC,&HDFD43C3E, &H80005055 ' 546!
      !dd &HE630030E, &HB80EF751,&HEF213E5C, &H8000505E ' 547!
      !dd &HA85F6345, &H3D0004B5,&HFFF194BF, &H80005067 ' 548!
      !dd &H648523F9, &H87744286,&H893844FF, &H80005071 ' 549!
      !dd &H5DFB05A4, &H7E81E376,&H9367721E, &H8000507A ' 550!
      !dd &HE223A492, &HD124C849,&H9EA1D34F, &H80005083 ' 551!
      !dd &HA7CE6D6E, &H0D7BA7EF,&HAB0677D2, &H8000508C ' 552!
      !dd &H58BE7531, &H5F900EE2,&HB8B87C6A, &H80005095 ' 553!
      !dd &HEA0614CE, &H1966E01A,&HC7DF9E9F, &H8000509E ' 554!
      !dd &H2CAD978E, &H760903ED,&HD8A8E671, &H800050A7 ' 555!
      !dd &H8E848294, &H362DCA43,&HEB476A3F, &H800050B0 ' 556!
      !dd &H7E8B280E, &HC470D08A,&HFFF53115, &H800050B9 ' 557!
      !dd &H77F4D453, &H5C8B79A3,&H8B7A1C3F, &H800050C3 ' 558!
      !dd &HF977CDD1, &H2D8A474D,&H9847D1D7, &H800050CC ' 559!
      !dd &H48DB091D, &H59CF3DFD,&HA68E8D83, &H800050D5 ' 560!
      !dd &H0653FF7C, &H6BE7936C,&HB67F320E, &H800050DE ' 561!
      !dd &H92F2336F, &HD47130D1,&HC8519DF1, &H800050E7 ' 562!
      !dd &H7315538F, &H6B1A772E,&HDC45BF2D, &H800050F0 ' 563!
      !dd &H2AC57E0B, &H07FB2749,&HF2A4D498, &H800050F9 ' 564!
      !dd &H1ED977CC, &HE267536D,&H85E1724C, &H80005103 ' 565!
      !dd &HA11A676E, &HFE483939,&H9400395A, &H8000510C ' 566!
      !dd &H51E8BD8A, &H4498FB5F,&HA3E63F84, &H80005115 ' 567!
      !dd &HBEDE3246, &HBC19B6DD,&HB5D36E76, &H8000511E ' 568!
      !dd &H6E9DEEDE, &HF40A93B9,&HCA117842, &H80005127 ' 569!
      !dd &H7025D2EE, &H89AFC675,&HE0F572E2, &H80005130 ' 570!
      !dd &HF8922EBC, &HA48D87D3,&HFAE1BB9F, &H80005139 ' 571!
      !dd &H67D9A81B, &H2CEB0EDF,&H8C2417CE, &H80005143 ' 572!
      !dd &H05B916A2, &H3D451025,&H9CD664A4, &H8000514C ' 573!
      !dd &H816A8060, &H20B06D19,&HAFD45AD4, &H80005155 ' 574!
      !dd &H24D71B2C, &H3AB62286,&HC576FC01, &H8000515E ' 575!
      !dd &HE971FE91, &H620CE6D6,&HDE25DB81, &H80005167 ' 576!
      !dd &H3214F762, &H4EFF8A25,&HFA59A9DF, &H80005170 ' 577!
      !dd &HFEC4D5A3, &H8C173D79,&H8D4F9C62, &H8000517A ' 578!
      !dd &H759B9798, &H716C4805,&H9FCD8759, &H80005183 ' 579!
      !dd &H2F3A41BA, &H527CA996,&HB506D353, &H8000518C ' 580!
      !dd &HEC979B96, &H0D1A7670,&HCD6C3ECE, &H80005195 ' 581!
      !dd &H5CF055DB, &H38E514A2,&HE9820B64, &H8000519E ' 582!
      !dd &H7069D4E2, &H4F646C7F,&H84F1C9FC, &H800051A8 ' 583!
      !dd &H5C38B6D1, &HCA8E8BC1,&H97A3CA63, &H800051B1 ' 584!
      !dd &H6DDECCE2, &H04EFDEAE,&HAD42A4BF, &H800051BA ' 585!
      !dd &HA3C0007F, &HA0A689DD,&HC64D468E, &H800051C3 ' 586!
      !dd &H9B3CA091, &H852EEF0F,&HE3599864, &H800051CC ' 587!
      !dd &HF623D033, &HB879F345,&H828C7281, &H800051D6 ' 588!
      !dd &HFBA83303, &H3AB84A5B,&H962E91BA, &H800051DF ' 589!
      !dd &HFEFED2C9, &H99AA5DAF,&HAD0FA9ED, &H800051E8 ' 590!
      !dd &HA6D7244F, &HC2E02724,&HC7C394A5, &H800051F1 ' 591!
      !dd &H60E8C1FB, &HA9532D42,&HE6FA23DF, &H800051FA ' 592!
      !dd &HB09ECA56, &H45CE6AF5,&H85C25B46, &H80005204 ' 593!
      !dd &H09E838BD, &H86FC7A17,&H9B2E7BE4, &H8000520D ' 594!
      !dd &HC6035DF0, &H12DE67E1,&HB45684FA, &H80005216 ' 595!
      !dd &HD07FEB59, &H19F6E4EC,&HD1ECB6CB, &H8000521F ' 596!
      !dd &H211D27EC, &HD1C661EE,&HF4C68323, &H80005228 ' 597!
      !dd &H905686D0, &H6B015A30,&H8EF1ED95, &H80005232 ' 598!
      !dd &HD0DD3AB8, &H4EB01503,&HA73C0974, &H8000523B ' 599!
      !dd &H78C340D0, &H4C3658A0,&HC3FA5B14, &H80005244 ' 600!
      !dd &H5DC13194, &H5375CB08,&HE60B5FE9, &H8000524D ' 601!
      !dd &H6B1E13A6, &HAB90BFDC,&H873DAFE2, &H80005257 ' 602!
      !dd &H1827EC24, &H750EF9F6,&H9F4726A5, &H80005260 ' 603!
      !dd &H507F1892, &H3017AAE0,&HBBE5EF97, &H80005269 ' 604!
      !dd &H0F1E2E89, &H2653F76A,&HDE07339C, &H80005272 ' 605!
      !dd &H43F25C8A, &HE8AEB0EB,&H8365430A, &H8000527C ' 606!
      !dd &HEB0DD4B5, &H6EDB1ABE,&H9BC68CFB, &H80005285 ' 607!
      !dd &HB7206C97, &H93A42FC2,&HB8FBC76A, &H8000528E ' 608!
      !dd &H1AD2112A, &H449CCACF,&HDC077AB2, &H80005297 ' 609!
      !dd &H5F7A233A, &H31DF66D0,&H83127497, &H800052A1 ' 610!
      !dd &HA9F04109, &H6E041931,&H9C6A8622, &H800052AA ' 611!
      !dd &H5D212DBD, &H2780E61D,&HBAF75455, &H800052B3 ' 612!
      !dd &H28003943, &HF3CBD382,&HDFD91E77, &H800052BC ' 613!
      !dd &H8AFC2256, &HECAEB752,&H8638AFC4, &H800052C6 ' 614!
      !dd &HA5F1DB3E, &H0A4BDD33,&HA1391721, &H800052CF ' 615!
      !dd &H23A6FBC6, &HC0634622,&HC1F8AFD3, &H800052D8 ' 616!
      !dd &H23F6BA68, &HAD57A204,&HE9C02FE2, &H800052E1 ' 617!
      !dd &H7FB46780, &H4D9D6347,&H8D127CE6, &H800052EB ' 618!
      !dd &HF0E49B21, &H6ED5C786,&HAA8DDA00, &H800052F4 ' 619!
      !dd &H67B4D3DA, &H8636DF9D,&HCE87C5FC, &H800052FD ' 620!
      !dd &H6A48D2F4, &HC8C98E38,&HFA7FADA2, &H80005306 ' 621!
      !dd &H448F3C23, &H60F66DE3,&H98288DF8, &H80005310 ' 622!
      !dd &H09EC49AD, &HB9FBDAB6,&HB92558BF, &H80005319 ' 623!
      !dd &HDC17F9CB, &HAAAAF28D,&HE1A58429, &H80005322 ' 624!
      !dd &H1595A236, &H6E6AD68B,&H89B945EA, &H8000532C ' 625!
      !dd &H0D63F354, &HA100A050,&HA863867B, &H80005335 ' 626!
      !dd &H0865E67C, &H65AA4452,&HCE35E130, &H8000533E ' 627!
      !dd &H9E4CFCB4, &H5CB2D7CC,&HFCEE1635, &H80005347 ' 628!
      !dd &H703CCA39, &H4730DB0E,&H9B5D3F24, &H80005351 ' 629!
      !dd &HC41ACCD5, &HA3991D8A,&HBF2BBCB1, &H8000535A ' 630!
      !dd &H84AF0770, &HED1F33E8,&HEB9A670C, &H80005363 ' 631!
      !dd &H81E40697, &HFA594209,&H91694B99, &H8000536D ' 632!
      !dd &HC1166A26, &HDE035A24,&HB3C6ADF7, &H80005376 ' 633!
      !dd &H8318C171, &HEDEA269F,&HDE9D056B, &H8000537F ' 634!
      !dd &H6A8B99F5, &HADC8F373,&H8A0BDF1C, &H80005389 ' 635!
      !dd &H5E59693E, &H9FDF9E69,&HAB7ABF25, &H80005392 ' 636!
      !dd &H17E23D70, &H4F67B696,&HD55836D0, &H8000539B ' 637!
      !dd &H83E17547, &HC9791E42,&H84EC7626, &H800053A5 ' 638!
      !dd &H0397E1DE, &H6872A944,&HA5E51D75, &H800053AE ' 639!
      !dd &H047DDA56, &HC28F5395,&HCF5E64D2, &H800053B7 ' 640!
      !dd &H080FC7EC, &HEE4A3812,&H81CED69C, &H800053C1 ' 641!
      !dd &H9C1BC9AF, &HC6CB104E,&HA2C45B1A, &H800053CA ' 642!
      !dd &HB90CE5C9, &H20A804FA,&HCC69986A, &H800053D3 ' 643!
      !dd &HAE611C84, &HBE89AB21,&H808E68DA, &H800053DD ' 644!
      !dd &HEE2D566C, &H91086E15,&HA1F36717, &H800053E6 ' 645!
      !dd &HAB83340A, &HBBFDA2E5,&HCC561B12, &H800053EF ' 646!
      !dd &H9D1E2621, &H164781AC,&H811B679B, &H800053F9 ' 647!
      !dd &H76DA2842, &H4832801E,&HA366AF20, &H80005402 ' 648!
      !dd &H9DA78808, &H6B840366,&HCF1FA8FC, &H8000540B ' 649!
      !dd &HA312D7D9, &H3A3F4C28,&H837998C4, &H80005415 ' 650!
      !dd &HAB587572, &H800F7B55,&HA72B1BBD, &H8000541E ' 651!
      !dd &H1832A590, &H5113B70F,&HD4E0E553, &H80005427 ' 652!
      !dd &H602E4C14, &H6173D27C,&H87C06A3D, &H80005431 ' 653!
      !dd &HDEDB232D, &H677AF1DC,&HAD66C7B4, &H8000543A ' 654!
      !dd &H0F195781, &H4A61C86A,&HDDD4FC7B, &H80005443 ' 655!
      !dd &HF1AC3C0E, &HFBA6A463,&H8E1C71BE, &H8000544D ' 656!
      !dd &H3F9D8310, &H91EB55F2,&HB65B7FF5, &H80005456 ' 657!
      !dd &H53C16D70, &H98877174,&HEA5B9772, &H8000545F ' 658!
      !dd &H9CE6BB2E, &HFFA92A43,&H96D271B6, &H80005469 ' 659!
      !dd &H28416D49, &HE590107B,&HC26B4695, &H80005472 ' 660!
      !dd &HFF787797, &H84DE7D46,&HFAFF7EA0, &H8000547B ' 661!
      !dd &H66286150, &HC5E5D5FD,&HA2442C5C, &H80005485 ' 662!
      !dd &HA1C94A03, &H22431E99,&HD21F4772, &H8000548E ' 663!
      !dd &H9EE885FE, &H023785D7,&H88404854, &H80005498 ' 664!
      !dd &H8DE50209, &H1CE11D56,&HB0F77DF1, &H800054A1 ' 665!
      !dd &H9692E3A5, &HA290D329,&HE631EED2, &H800054AA ' 666!
      !dd &H56D42DC8, &HB363D58B,&H95F1064F, &H800054B4 ' 667!
      !dd &HCB48D3BB, &HFC0C409B,&HC3A0763B, &H800054BD ' 668!
      !dd &H911EA8A7, &H60D6026B,&HFF9D2A7D, &H800054C6 ' 669!
      !dd &H61738F5A, &H08DC0695,&HA73F554D, &H800054D0 ' 670!
      !dd &HC536F25E, &H751C5AA0,&HDB2F804A, &H800054D9 ' 671!
      !dd &H816C0F0E, &HDCDA9B79,&H8FD72C30, &H800054E3 ' 672!
      !dd &H369E89C9, &H3A4D595D,&HBD125596, &H800054EC ' 673!
      !dd &HB4E6B362, &HC2BFD2A3,&HF8E522AA, &H800054F5 ' 674!
      !dd &H697F12BF, &H0FDFF219,&HA4110A9A, &H800054FF ' 675!
      !dd &H8D49C6C0, &H68F5ADA5,&HD89E7FFF, &H80005508 ' 676!
      !dd &HB3A906A6, &H9C246D0D,&H8F36CA1F, &H80005512 ' 677!
      !dd &H24E8D3CE, &HDBC43C69,&HBDA58DA7, &H8000551B ' 678!
      !dd &H7072C4E4, &H1BF2BE1D,&HFB810D5C, &H80005524 ' 679!
      !dd &H8CAC36C0, &H2A8F323F,&HA703B2DF, &H8000552E ' 680!
      !dd &H869B0ED2, &HD41B7655,&HDE246B69, &H80005537 ' 681!
      !dd &HF626455F, &HFBC44A4F,&H93F34189, &H80005541 ' 682!
      !dd &HAADC0D8A, &H915A5921,&HC55CFFED, &H8000554A ' 683!
      !dd &H7D20FD0B, &HB0175989,&H83D51EF3, &H80005554 ' 684!
      !dd &H71E8A28B, &H07173D4A,&HB060A1E9, &H8000555D ' 685!
      !dd &HBE9EB1C9, &H3880231E,&HEC5178EF, &H80005566 ' 686!
      !dd &HE062F7C6, &H7E27F78F,&H9E8BA8E2, &H80005570 ' 687!
      !dd &H5584FCF3, &H5985B4A9,&HD50BAAF0, &H80005579 ' 688!
      !dd &HEFCABB32, &H383C36CE,&H8F5919C4, &H80005583 ' 689!
      !dd &HE1283647, &H6FC925DC,&HC12F13B9, &H8000558C ' 690!
      !dd &HCCEFE2A0, &H622EFC4C,&H825C848F, &H80005596 ' 691!
      !dd &HCCFC384D, &HCAB380FF,&HB0310B29, &H8000559F ' 692!
      !dd &H3AF36234, &H10DBF61A,&HEE7A619C, &H800055A8 ' 693!
      !dd &HC6F3F30E, &H456D134A,&HA19FF127, &H800055B2 ' 694!
      !dd &H0110246D, &HCEBD8FB0,&HDB649BD8, &H800055BB ' 695!
      !dd &HA0B8F8C2, &H5C84D7A9,&H951E61ED, &H800055C5 ' 696!
      !dd &H6B4BCEA5, &HA072D796,&HCAFFDC4F, &H800055CE ' 697!
      !dd &H08232C5B, &H46DE47F4,&H8A5F67AC, &H800055D8 ' 698!
      !dd &HA91C050F, &HB2C0773B,&HBCE94009, &H800055E1 ' 699!
      !dd &HC89A2775, &HA1319181,&H812372C6, &H800055EB ' 700!
      !dd &H31270F06, &HF3B25DB8,&HB0CF08A4, &H800055F4 ' 701!
      !dd &H8B648D99, &H2A218E7F,&HF26BDCDA, &H800055FD ' 702!
      !dd &H0FF24836, &HC66C8994,&HA66D8CDE, &H80005607 ' 703!
      !dd &H95ED234A, &H50D53D2B,&HE4D6A1B2, &H80005610 ' 704!
      !dd &H41F8838B, &H0426CF5D,&H9D8CC4D3, &H8000561A ' 705!
      !dd &H97F7AD63, &HF8B983EF,&HD93F1B66, &H80005623 ' 706!
      !dd &HAC2C40F6, &H583A15D7,&H95FE522B, &H8000562D ' 707!
      !dd &H3C1531D5, &HF0005234,&HCF69AD9F, &H80005636 ' 708!
      !dd &HAA99ACC0, &HFCEC38EA,&H8F9BEB76, &H80005640 ' 709!
      !dd &H6A931A8F, &H00BB92ED,&HC7253786, &H80005649 ' 710!
      !dd &H58BFA3B1, &H4B023D44,&H8A46174D, &H80005653 ' 711!
      !dd &H0B6A7FA2, &H7C4F1D33,&HC0497867, &H8000565C ' 712!
      !dd &HCAB2E75E, &H0E4E1614,&H85E32816, &H80005666 ' 713!
      !dd &HFEAB7CA7, &HC1F2E4CA,&HBAB5C6E6, &H8000566F ' 714!
      !dd &HBD523D49, &H9FEC5940,&H825E6CA1, &H80005679 ' 715!
      !dd &H88C101B5, &H05A484D0,&HB6500BEA, &H80005682 ' 716!
      !dd &H078248E3, &H38E6E3FE,&HFF4F18AF, &H8000568B ' 717!
      !dd &H9E43DA1B, &HDC65E4DC,&HB303F5CE, &H80005695 ' 718!
      !dd &HD04048CA, &HFE8116E3,&HFB640FAF, &H8000569E ' 719!
      !dd &H2E6D332E, &HBEF2C418,&HB0C25B07, &H800056A8 ' 720!
      !dd &H0D60C692, &H6864DD24,&HF8E9B130, &H800056B1 ' 721!
      !dd &HEB6EBC02, &HA19B1DEB,&HAF80C56E, &H800056BB ' 722!
      !dd &HA4F4DE7D, &HB9348AC0,&HF7D456CB, &H800056C4 ' 723!
      !dd &H34A1214E, &H09F2261A,&HAF39215E, &H800056CE ' 724!
      !dd &H1B8629A9, &HA91562F4,&HF81E65BF, &H800056D7 ' 725!
      !dd &H11839E89, &H6260A9A8,&HAFE98D23, &H800056E1 ' 726!
      !dd &H24DE639C, &HBE3040E6,&HF9C81FE7, &H800056EA ' 727!
      !dd &H9E361AD1, &HC1364E23,&HB19446AE, &H800056F4 ' 728!
      !dd &HB6C4092E, &HD219D241,&HFCD79EA3, &H800056FD ' 729!
      !dd &HD8CAC08C, &HC9476863,&HB43FB697, &H80005707 ' 730!
      !dd &H4702BCF4, &HDAEFB9C5,&H80AC7B98, &H80005711 ' 731!
      !dd &H0B85EA24, &H8902BB98,&HB7F698B4, &H8000571A ' 732!
      !dd &H963F9BDB, &H3B1334C8,&H83AF44CF, &H80005724 ' 733!
      !dd &H8F65306E, &H15B088AB,&HBCC843A5, &H8000572D ' 734!
      !dd &H242CE183, &HBE517619,&H8780BE8D, &H80005737 ' 735!
      !dd &H2400842D, &HC19519C4,&HC2C911EB, &H80005740 ' 736!
      !dd &H6AE95F21, &HEE138FCB,&H8C313725, &H8000574A ' 737!
      !dd &H351A621F, &HAC2A3244,&HCA12F07D, &H80005753 ' 738!
      !dd &HB952CA50, &HB1FF73C6,&H91D52B0E, &H8000575D ' 739!
      !dd &H37D9A867, &H3D433555,&HD2C6183B, &H80005766 ' 740!
      !dd &HEAAA411D, &HDE14E257,&H9885D908, &H80005770 ' 741!
      !dd &H6914BC5C, &HD9D84405,&HDD09F987, &H80005779 ' 742!
      !dd &HECFECBAC, &H5250AB5A,&HA061FCCE, &H80005783 ' 743!
      !dd &H20623FF6, &HCF9D3900,&HE90E635B, &H8000578C ' 744!
      !dd &H578F7B09, &H8BCC22B8,&HA98EB7C9, &H80005796 ' 745!
      !dd &H97940E44, &HA8B06E96,&HF70CF1C8, &H8000579F ' 746!
      !dd &H5B134168, &H210EB4AC,&HB438B161, &H800057A9 ' 747!
      !dd &HE68710C7, &HF325BDF9,&H83A56991, &H800057B3 ' 748!
      !dd &H13BC960B, &H0232B66A,&HC0957AF0, &H800057BC ' 749!
      !dd &HB1749FE5, &HC99C249A,&H8D0D7B8A, &H800057C6 ' 750!
      !dd &HE74A9088, &H12B887B0,&HCEE546B6, &H800057CF ' 751!
      !dd &HE9DAC224, &HB5BF83A5,&H97F05FED, &H800057D9 ' 752!
      !dd &H826E3A86, &H19CC291D,&HDF750515, &H800057E2 ' 753!
      !dd &H3A8A2A18, &H097ED446,&HA489AA3E, &H800057EC ' 754!
      !dd &H8F52BD12, &H7B008605,&HF2A1008A, &H800057F5 ' 755!
      !dd &H1AD01596, &H3CCF62F2,&HB320DD66, &H800057FF ' 756!
      !dd &H7A5253F5, &HD4744FE5,&H846C0BAB, &H80005809 ' 757!
      !dd &HBC17E24C, &H63883248,&HC40BF547, &H80005812 ' 758!
      !dd &H696AB3FC, &HAA063345,&H914FDD0D, &H8000581C ' 759!
      !dd &H087A632A, &H4861341B,&HD7B28C20, &H80005825 ' 760!
      !dd &H170CF432, &HFDCA3CF9,&HA04C70A2, &H8000582F ' 761!
      !dd &HB74E476F, &H93B5FCBE,&HEE91C3A2, &H80005838 ' 762!
      !dd &H1B1593BA, &H638FDA13,&HB1C31C85, &H80005842 ' 763!
      !dd &H41351938, &H854853B4,&H84A09247, &H8000584C ' 764!
      !dd &HD36DD62E, &HDCA49110,&HC629EA8F, &H80005855 ' 765!
      !dd &H1628A9B7, &H9D8D1A84,&H943C5AF6, &H8000585F ' 766!
      !dd &HDF31EA3E, &H7104E138,&HDE106A44, &H80005868 ' 767!
      !dd &HA7656FAE, &H54C3A8EA,&HA68C4FB3, &H80005872 ' 768!
      !dd &H706BDA3D, &HD8CFDF34,&HFA25BDB4, &H8000587B ' 769!
      !dd &HEE89199B, &H7D084F56,&HBC196126, &H80005885 ' 770!
      !dd &HB419BA07, &HBAA401BC,&H8DA01BE5, &H8000588F ' 771!
      !dd &H878ECA7F, &H636B4A9E,&HD58B6A10, &H80005898 ' 772!
      !dd &H2BD48A5D, &HDF0CBE14,&HA1337DD0, &H800058A2 ' 773!
      !dd &H7E424D2A, &HC1304358,&HF3B0D732, &H800058AB ' 774!
      !dd &H398EADE7, &HA9B646F8,&HB86F16DE, &H800058B5 ' 775!
      !dd &H1B9E1FC9, &HBC9C21C8,&H8BC42F54, &H800058BF ' 776!
      !dd &H2DE9773C, &H183AF144,&HD41B39D4, &H800058C8 ' 777!
      !dd &H4CE1E117, &HA468C84E,&HA126AF6F, &H800058D2 ' 778!
      !dd &H21F9ABF9, &H5CA56CC3,&HF5305BEC, &H800058DB ' 779!
      !dd &HA2E12DFE, &H0A9201D8,&HBAC3D605, &H800058E5 ' 780!
      !dd &H7A3A3E54, &H584FDBE8,&H8E71DCFB, &H800058EF ' 781!
      !dd &H12AEF533, &HE3E1F8E0,&HD98FE883, &H800058F8 ' 782!
      !dd &H564947FE, &HD9800A0D,&HA65BCA0A, &H80005902 ' 783!
      !dd &H6C20363C, &H9D0C0F64,&HFEBC8D60, &H8000590B ' 784!
      !dd &HBBE3B194, &H50647ECC,&HC3480B61, &H80005915 ' 785!
      !dd &H263845CE, &H32352354,&H95E4CCBC, &H8000591F ' 786!
      !dd &HD8BF7F4C, &H472CADCD,&HE66730B3, &H80005928 ' 787!
      !dd &H67CB5CF5, &HF5C561BF,&HB14D6879, &H80005932 ' 788!
      !dd &HBAB97160, &HF89E5590,&H889CE4BF, &H8000593C ' 789!
      !dd &H501C21EF, &H349C4E06,&HD2CA14F4, &H80005945 ' 790!
      !dd &H6061BB37, &HA3A3BD45,&HA2D399AF, &H8000594F ' 791!
      !dd &H51172D98, &HB12148C7,&HFBDF51BB, &H80005958 ' 792!
      !dd &H5A8C330F, &H99EC069C,&HC30DB10B, &H80005962 ' 793!
      !dd &H3C35B597, &H7ED98320,&H973E1DC7, &H8000596C ' 794!
      !dd &H8D7D6577, &H4376BD1A,&HEAD6F33D, &H80005975 ' 795!
      !dd &HA3FC79DF, &H9F714CFF,&HB68D1714, &H8000597F ' 796!
      !dd &HF86241DB, &HCD18EF2D,&H8E155036, &H80005989 ' 797!
      !dd &HA62124A4, &H69A9DCC8,&HDD733805, &H80005992 ' 798!
      !dd &H8FA05C57, &H39324A05,&HACCAA6F6, &H8000599C ' 799!
      !dd &H58354824, &H5CAF49D4,&H86FE5270, &H800059A6 ' 800!
      !dd &HB3FF5B5C, &HC9003B00,&HD330DFF8, &H800059AF ' 801!
      !dd &H0CF97F0E, &H596CAE36,&HA567C76A, &H800059B9 ' 802!
      !dd &HE2ACA662, &HA59FF99C,&H81B521A0, &H800059C3 ' 803!
      !dd &H5BF31D46, &H441535F8,&HCBAE6ECE, &H800059CC ' 804!
      !dd &H7E48DEC3, &HA705ACAD,&HA01EE09B, &H800059D6 ' 805!
      !dd &H1DCCB6AE, &H07EDEED5,&HFC109B95, &H800059DF ' 806!
      !dd &H743C14F7, &HB2FFC2F8,&HC6A6169C, &H800059E9 ' 807!
      !dd &H0BB7688B, &HA53DCFD8,&H9CBF0DD7, &H800059F3 ' 808!
      !dd &HDE834CB0, &H3C982AE8,&HF7ABE15F, &H800059FC ' 809!
      !dd &H3402DC29, &HD56E5DF1,&HC3E975C5, &H80005A06 ' 810!
      !dd &HC7F143DE, &H6EC928E6,&H9B292606, &H80005A10 ' 811!
      !dd &H0118A1A1, &H33B306DE,&HF613424E, &H80005A19 ' 812!
      !dd &HC25ECE53, &H968BE333,&HC35ECA64, &H80005A23 ' 813!
      !dd &HA5025D03, &HF5AC331B,&H9B4DD9E2, &H80005A2D ' 814!
      !dd &H8129430F, &HC60F9B5A,&HF7366C54, &H80005A36 ' 815!
      !dd &H1EECE170, &H8DD46FCC,&HC4FF5E53, &H80005A40 ' 816!
      !dd &H9BAC7EDD, &H29E8BE32,&H9D2CBF02, &H80005A4A ' 817!
      !dd &HDAB696B0, &H74F4D7DE,&HFB1C7D2A, &H80005A53 ' 818!
      !dd &H7D6D8905, &HB50AD3A7,&HC8D7091B, &H80005A5D ' 819!
      !dd &H1F70B6B9, &H2FF9AB7D,&HA0D4324B, &H80005A67 ' 820!
      !dd &H11751E80, &HC836ECBE,&H80F22152, &H80005A71 ' 821!
      !dd &H260707F7, &HE7702E15,&HCF04BB7F, &H80005A7A ' 822!
      !dd &H7F5026A7, &H0C426909,&HA6620DB2, &H80005A84 ' 823!
      !dd &HA4727F1A, &H45DD7085,&H85E2E705, &H80005A8E ' 824!
      !dd &H577A7DCE, &HFF134FCF,&HD7BC1D3F, &H80005A97 ' 825!
      !dd &HC0104E7B, &H1F4113E0,&HAE053D98, &H80005AA1 ' 826!
      !dd &HC31D2B62, &H9B3DCECD,&H8C8ABB7E, &H80005AAB ' 827!
      !dd &HC1892C28, &HBF0DF470,&HE3485B36, &H80005AB4 ' 828!
      !dd &H48AE4CFF, &H122C0C24,&HB80053D8, &H80005ABE ' 829!
      !dd &H68E94769, &HA2BAB3D7,&H952443F5, &H80005AC8 ' 830!
      !dd &H1EC69F67, &H2D9E06E4,&HF2105C4D, &H80005AD1 ' 831!
      !dd &H59016183, &HB5106599,&HC4AD4AFE, &H80005ADB ' 832!
      !dd &HFEA75F93, &HB2CA96A5,&H9FFDF841, &H80005AE5 ' 833!
      !dd &H31E75157, &H821DFFB2,&H824E58B1, &H80005AEF ' 834!
      !dd &H1C62BF28, &H7DB3EC81,&HD482C5A5, &H80005AF8 ' 835!
      !dd &H682C9E10, &H1B9FE415,&HAD7EC35C, &H80005B02 ' 836!
      !dd &H7F667832, &H0994712E,&H8DCFDD2F, &H80005B0C ' 837!
      !dd &H1A84B6BA, &HFCADF53F,&HE81B3703, &H80005B15 ' 838!
      !dd &H73FA3CB7, &H844787B0,&HBE2C4C53, &H80005B1F ' 839!
      !dd &HBF2345CE, &H8282AD4E,&H9C00569C, &H80005B29 ' 840!
      !dd &HEC7AB815, &H0A2FD2D5,&H801F4722, &H80005B33 ' 841!
      !dd &HCDE5D0BA, &HFAC0A5B9,&HD2B36FFA, &H80005B3C ' 842!
      !dd &HB640F195, &HDDEE186E,&HAD75386F, &H80005B46 ' 843!
      !dd &H4037871E, &H33EB3E23,&H8EF79D84, &H80005B50 ' 844!
      !dd &H2D7BA47F, &HAFAFBE0D,&HEBF3A976, &H80005B59 ' 845!
      !dd &HE313A667, &H8E25B183,&HC2EFCE81, &H80005B63 ' 846!
      !dd &HD71380E3, &HA953AD94,&HA13DDB0F, &H80005B6D ' 847!
      !dd &H421C26BC, &HF8394BBF,&H85873968, &H80005B77 ' 848!
      !dd &HA51FAE3B, &H8F9B021A,&HDD6ABAB2, &H80005B80 ' 849!
      !dd &H1E10CC20, &H38342B3F,&HB7CB17F9, &H80005B8A ' 850!
      !dd &HB43C75A4, &H5D755AF0,&H98BE082C, &H80005B94 ' 851!
      !dd &H8BEC9BC3, &HD3854954,&HFE2C3999, &H80005B9D ' 852!
      !dd &HAD8ED8C0, &H6372C755,&HD3BA56FB, &H80005BA7 ' 853!
      !dd &HF43EA1C4, &HA770393D,&HB093E78A, &H80005BB1 ' 854!
      !dd &H7AAF4B91, &H054DF3CB,&H936F7E94, &H80005BBB ' 855!
      !dd &H311D1257, &H78DE5398,&HF67E679F, &H80005BC4 ' 856!
      !dd &H1F1A9499, &H36E81176,&HCE4B4A39, &H80005BCE ' 857!
      !dd &H790FC583, &HF08172A1,&HACDA15B0, &H80005BD8 ' 858!
      !dd &HF44DFAEF, &H2DC096E8,&H90FFF1B2, &H80005BE2 ' 859!
      !dd &H4A5AFB7E, &H48D97D7B,&HF38DE7F9, &H80005BEB ' 860!
      !dd &HEA44FFF6, &H5A80DEC1,&HCCC9114C, &H80005BF5 ' 861!
      !dd &H3CB51577, &HC62F7B84,&HAC63420F, &H80005BFF ' 862!
      !dd &HB2299CD7, &HCB468458,&H9148A6EC, &H80005C09 ' 863!
      !dd &HACA638AB, &H9706FF55,&HF52A99AF, &H80005C12 ' 864!
      !dd &H1F17695F, &H9353A930,&HCF193C52, &H80005C1C ' 865!
      !dd &H324B4C9D, &HD5984095,&HAF24D783, &H80005C26 ' 866!
      !dd &H5255411E, &HDF18A8AE,&H944A7178, &H80005C30 ' 867!
      !dd &H87948864, &HEA37CDF7,&HFB66345E, &H80005C39 ' 868!
      !dd &H4FCECCBF, &H8C43DB8A,&HD5587BF1, &H80005C43 ' 869!
      !dd &H02CE32F4, &HB8ABA706,&HB542AD4D, &H80005C4D ' 870!
      !dd &H5CE2E3D7, &HDBD40151,&H9A2D76E8, &H80005C57 ' 871!
      !dd &H49193605, &H4B32891F,&H834AB742, &H80005C61 ' 872!
      !dd &HD8237C9C, &H8937AACD,&HDFDCE578, &H80005C6A ' 873!
      !dd &HB0FA49DB, &H611E0348,&HBF1209DB, &H80005C74 ' 874!
      !dd &H5D39DE9C, &H353C654E,&HA344A9EC, &H80005C7E ' 875!
      !dd &H09C0816F, &H118AAAAA,&H8BABBD5D, &H80005C88 ' 876!
      !dd &H41B43DB5, &HEA8C0554,&HEF3DABDB, &H80005C91 ' 877!
      !dd &HBE560AE9, &H0F9B0E91,&HCD2160DB, &H80005C9B ' 878!
      !dd &H9B225BDE, &H0AA559C1,&HB01566E4, &H80005CA5 ' 879!
      !dd &H615186F2, &HF9261922,&H9752646B, &H80005CAF ' 880!
      !dd &HD43A645A, &HE51B071F,&H8230A2E5, &H80005CB9 ' 881!
      !dd &HD49896DF, &H07AB8F45,&HE045C89E, &H80005CC2 ' 882!
      !dd &H77129419, &H451D2FCB,&HC1642CBE, &H80005CCC ' 883!
      !dd &HA5CB09D9, &H41AA3242,&HA6F37AA0, &H80005CD6 ' 884!
      !dd &H19C9BA43, &H00C057F0,&H9049EDBB, &H80005CE0 ' 885!
      !dd &H7CA01552, &H9A4CD82C,&HF9AFEE62, &H80005CE9 ' 886!
      !dd &H88F3AA78, &HE9281040,&HD84824BD, &H80005CF3 ' 887!
      !dd &HF6C34DD4, &HB030BE17,&HBB8E8FDC, &H80005CFD ' 888!
      !dd &H4DFB0E51, &H57F65108,&HA2D48465, &H80005D07 ' 889!
      !dd &HB7C6B3F2, &H14F3956D,&H8D85B512, &H80005D11 ' 890!
      !dd &H6F504A25, &HF775E48A,&HF6482E9A, &H80005D1A ' 891!
      !dd &H96F6F096, &HFD8FB214,&HD688E098, &H80005D24 ' 892!
      !dd &H74A6D94F, &H6B1F900C,&HBB16DDDD, &H80005D2E ' 893!
      !dd &HDFD7AAB9, &HCF060E42,&HA35676B2, &H80005D38 ' 894!
      !dd &HF324BF77, &HC8718AF6,&H8EC2D23E, &H80005D42 ' 895!
      !dd &H29804F10, &HDEC6B330,&HF9D4EFED, &H80005D4B ' 896!
      !dd &HF05AA542, &H1E658E76,&HDAD8C72C, &H80005D55 ' 897!
      !dd &H4DC77DEC, &H30A80F6F,&HBFEB1AAA, &H80005D5F ' 898!
      !dd &HF788E3CD, &HEA378B8C,&HA87DA7A8, &H80005D69 ' 899!
      !dd &HE58F5037, &H75DAD1A6,&H9416705B, &H80005D73 ' 900!
      !dd &H197C5955, &H7972C8F8,&H824CBE5C, &H80005D7D ' 901!
      !dd &H14E61160, &HE9F5380D,&HE58D335C, &H80005D86 ' 902!
      !dd &H892DE1D2, &H2F4FFE2D,&HCA6D440B, &H80005D90 ' 903!
      !dd &H331A815C, &HDFC49E64,&HB2B47611, &H80005D9A ' 904!
      !dd &H0E2A2CD3, &H4C0384FC,&H9DEFFD59, &H80005DA4 ' 905!
      !dd &H028850A9, &H81C11D29,&H8BBCD5A7, &H80005DAE ' 906!
      !dd &H25FC7AE3, &H3C5B9928,&HF78B047C, &H80005DB7 ' 907!
      !dd &H99AEE0F8, &H298538CE,&HDB8044FA, &H80005DC1 ' 908!
      !dd &H65EC7D34, &H115B82AD,&HC2D99D3B, &H80005DCB ' 909!
      !dd &H1813A944, &HFDECD2A1,&HAD286339, &H80005DD5 ' 910!
      !dd &HD12B7DD6, &HD7A77062,&H9A0CAE46, &H80005DDF ' 911!
      !dd &H024ABC12, &H18112018,&H89334B37, &H80005DE9 ' 912!
      !dd &HD016445F, &HBE6A89BA,&HF4A7F79F, &H80005DF2 ' 913!
      !dd &H3EBBE007, &H157617EF,&HDA5FEC86, &H80005DFC ' 914!
      !dd &H074E606E, &HCFAD45E3,&HC3213698, &H80005E06 ' 915!
      !dd &H15891C42, &HB1C5FF84,&HAE8CB5D6, &H80005E10 ' 916!
      !dd &H0849088E, &H82B28F11,&H9C4F81D6, &H80005E1A ' 917!
      !dd &HC4ED792C, &HCE2B1341,&H8C2146E5, &H80005E24 ' 918!
      !dd &H8CF83EFE, &H7B8E5110,&HFB85BAC1, &H80005E2D ' 919!
      !dd &HDEA70898, &HD501DCD4,&HE1FA25C9, &H80005E37 ' 920!
      !dd &H7541BB7B, &HC7D4ECDE,&HCB3F3C7C, &H80005E41 ' 921!
      !dd &H4C93AF4E, &H59ED3746,&HB7006FF6, &H80005E4B ' 922!
      !dd &H9D861E44, &H4D8E9192,&HA4F3A4EB, &H80005E55 ' 923!
      !dd &H4C24054F, &H52FBA55B,&H94D7D9D0, &H80005E5F ' 924!
      !dd &HB88789CC, &H6EF5D11E,&H8673FB81, &H80005E69 ' 925!
      !dd &H8FBD2237, &H17AE9536,&HF32BC3DF, &H80005E72 ' 926!
      !dd &H249F77BA, &H35B04B94,&HDC22DE91, &H80005E7C ' 927!
      !dd &H41308480, &H98A7C47E,&HC77F99B3, &H80005E86 ' 928!
      !dd &H8AA44435, &H2F3E3403,&HB4FD8331, &H80005E90 ' 929!
      !dd &H376A2FF2, &H2B67FE3D,&HA4603DA6, &H80005E9A ' 930!
      !dd &H2821CB18, &HD3F6CC66,&H9572800C, &H80005EA4 ' 931!
      !dd &HFA86C1D9, &HACEBA008,&H8805368B, &H80005EAE ' 932!
      !dd &H5C86903D, &H869B5F20,&HF7DD7FE5, &H80005EB7 ' 933!
      !dd &H0464BC90, &HDA46B744,&HE2148827, &H80005EC1 ' 934!
      !dd &H5B02FB2C, &H638E11D6,&HCE6E3F52, &H80005ECB ' 935!
      !dd &HEF30B996, &H4EFFDC4D,&HBCB0C5E1, &H80005ED5 ' 936!
      !dd &H501E55D2, &H6A899F56,&HACA8C111, &H80005EDF ' 937!
      !dd &H9063C99D, &H74171074,&H9E2894DA, &H80005EE9 ' 938!
      !dd &HE3678121, &H51F42656,&H9107B67F, &H80005EF3 ' 939!
      !dd &HC2C00389, &HE03B1F31,&H85221486, &H80005EFD ' 940!
      !dd &HF46DE67F, &HE31CA8D4,&HF4AF22B9, &H80005F06 ' 941!
      !dd &HE6DB198A, &H006CDD4F,&HE1171C72, &H80005F10 ' 942!
      !dd &H54D844C5, &HFBE440CE,&HCF490871, &H80005F1A ' 943!
      !dd &H36375F65, &H14366BBE,&HBF1753C9, &H80005F24 ' 944!
      !dd &H498899C9, &H50E738EE,&HB0594712, &H80005F2E ' 945!
      !dd &H22EEB212, &H6BBD9C18,&HA2EA7A28, &H80005F38 ' 946!
      !dd &H524E3F2F, &HE1A39A1B,&H96AA5878, &H80005F42 ' 947!
      !dd &H4B32707E, &HE8E475AB,&H8B7BB3E7, &H80005F4C ' 948!
      !dd &HFF707EC1, &HAC95BA0C,&H8144647A, &H80005F56 ' 949!
      !dd &H1DF5BB30, &H9E39D036,&HEFD9E66F, &H80005F5F ' 950!
      !dd &H4252F698, &H2932311E,&HDEC09DC2, &H80005F69 ' 951!
      !dd &H21A92141, &H824CA9AA,&HCF1712AA, &H80005F73 ' 952!
      !dd &H95D3A733, &H2FC3D8E6,&HC0BB391F, &H80005F7D ' 953!
      !dd &HD295AF45, &H8DFFF592,&HB38E6CB7, &H80005F87 ' 954!
      !dd &HADE51935, &H2FAE7646,&HA77513E4, &H80005F91 ' 955!
      !dd &HFC58E289, &H0883E06B,&H9C564D92, &H80005F9B ' 956!
      !dd &HEB9611B6, &HBA753F7C,&H921BA7FE, &H80005FA5 ' 957!
      !dd &H5E66E592, &HCF70B0E5,&H88B0DFAA, &H80005FAF ' 958!
      !dd &HCF28DD80, &H37C5C9AA,&H8003A578, &H80005FB9 ' 959!
      !dd &H446C9F4F, &H6892DA20,&HF006D641, &H80005FC2 ' 960!
      !dd &HC836F082, &HE263D134,&HE1426A92, &H80005FCC ' 961!
      !dd &H16179CF2, &HFDAEC60A,&HD39EE51E, &H80005FD6 ' 962!
      !dd &HFC46B4D9, &HE5121CBD,&HC703ADF8, &H80005FE0 ' 963!
      !dd &HDA7E9040, &H4FA60D0E,&HBB5A76C7, &H80005FEA ' 964!
      !dd &H3F67C570, &H53CF3BCE,&HB08F006F, &H80005FF4 ' 965!
      !dd &H10D064C2, &H058FFEEB,&HA68EE6E9, &H80005FFE ' 966!
      !dd &H7B20CB26, &H8D00BAFA,&H9D49728E, &H80006008 ' 967!
      !dd &HC865000A, &HC14AB0C0,&H94AF6E4A, &H80006012 ' 968!
      !dd &H6DA19349, &H3D68EDC2,&H8CB3021E, &H8000601C ' 969!
      !dd &HACD98E05, &HA52BE538,&H85479181, &H80006026 ' 970!
      !dd &HFBCE96D6, &H5EBEBF36,&HFCC33A73, &H8000602F ' 971!
      !dd &H3105192D, &H82EF0F81,&HEFED507B, &H80006039 ' 972!
      !dd &H81D4182C, &H5C29A77B,&HE3FA3EB9, &H80006043 ' 973!
      !dd &HF9FD3CFE, &H4F299ECD,&HD8D886A9, &H8000604D ' 974!
      !dd &H9EC6DED3, &HB51FE0F4,&HCE782A37, &H80006057 ' 975!
      !dd &H27558C61, &H18A26269,&HC4CA883D, &H80006061 ' 976!
      !dd &HD3C75F30, &H4AC0EE64,&HBBC23C7C, &H8000606B ' 977!
      !dd &H4C43EA69, &HB56543AF,&HB35302C4, &H80006075 ' 978!
      !dd &HD829EE5C, &H906C9075,&HAB719CE5, &H8000607F ' 979!
      !dd &HC7E0211E, &HB337E640,&HA413BB27, &H80006089 ' 980!
      !dd &H8F7B77BA, &HC8714D55,&H9D2FE70B, &H80006093 ' 981!
      !dd &H8D18E751, &HCCB8A7A9,&H96BD7011, &H8000609D ' 982!
      !dd &H0332A80E, &H164642F3,&H90B45A55, &H800060A7 ' 983!
      !dd &H8512AD7D, &HC3678455,&H8B0D4ECD, &H800060B1 ' 984!
      !dd &H43413762, &H6D36530B,&H85C18D0D, &H800060BB ' 985!
      !dd &H58424BD4, &H6DA8CEF6,&H80CADE51, &H800060C5 ' 986!
      !dd &HE323CD2C, &HF8E4EAF7,&HF8471391, &H800060CE ' 987!
      !dd &H2C278AF6, &HD724DEB5,&HEF8C93E1, &H800060D8 ' 988!
      !dd &H7AE530F6, &HDF0A5C18,&HE75C85D3, &H800060E2 ' 989!
      !dd &HAAD094D6, &H56228409,&HDFADF362, &H800060EC ' 990!
      !dd &H5B0F5C0A, &H6ADBE748,&HD878984A, &H800060F6 ' 991!
      !dd &H1836E12A, &H1785080E,&HD1B4D388, &H80006100 ' 992!
      !dd &HAAFB37D9, &HB8CEC10F,&HCB5B9A20, &H8000610A ' 993!
      !dd &HB578DBB6, &HC364B267,&HC5666B1C, &H80006114 ' 994!
      !dd &H45952F7D, &H32DC185A,&HBFCF4494, &H8000611E ' 995!
      !dd &HCDAE1B30, &H257813AF,&HBA9099B4, &H80006128 ' 996!
      !dd &HEB01C3F9, &HA57B292A,&HB5A549A6, &H80006132 ' 997!
      !dd &H540A387F, &HEA47889F,&HB1089747, &H8000613C ' 998!
      !dd &H703CF89E, &H68CF4989,&HACB62196, &H80006146 ' 999!
      !dd &H379B8ACA, &HE25A6DD0,&HA8A9DCCC, &H80006150 ' 1000!
      !dd &HCA5BCC6C, &H4844E5D8,&HA4E00C17, &H8000615A ' 1001!
      !dd &HA202D388, &HC8376AE8,&HA1553BD4, &H80006164 ' 1002!
      !dd &H5CB044B1, &HAB1C47F7,&H9E063C5A, &H8000616E ' 1003!
      !dd &H87E0D35A, &HE5C4BA8F,&H9AF01D2C, &H80006178 ' 1004!
      !dd &H5E1B676E, &H50815419,&H981028A2, &H80006182 ' 1005!
      !dd &HEBF3EC1D, &H76170E1E,&H9563DFEB, &H8000618C ' 1006!
      !dd &HE8891F71, &HCD612C22,&H92E8F773, &H80006196 ' 1007!
      !dd &H5CE6FAF3, &HFE2BA772,&H909D5395, &H800061A0 ' 1008!
      !dd &H700A98C6, &H8BB283BE,&H8E7F059C, &H800061AA ' 1009!
      !dd &H558273B0, &HE7C992F1,&H8C8C4908, &H800061B4 ' 1010!
      !dd &HC52C8BB8, &H8AD843D3,&H8AC3811B, &H800061BE ' 1011!
      !dd &H49DD0614, &H3837BB08,&H89233698, &H800061C8 ' 1012!
      !dd &HF311E644, &H159D21C5,&H87AA15C2, &H800061D2 ' 1013!
      !dd &H84323984, &HB06718F1,&H8656EC8B, &H800061DC ' 1014!
      !dd &H64C8C883, &H761A30F9,&H8528A8F7, &H800061E6 ' 1015!
      !dd &H71FF36F2, &H872DFC97,&H841E57A5, &H800061F0 ' 1016!
      !dd &H68F7B851, &H25816C1D,&H8337228C, &H800061FA ' 1017!
      !dd &H3CDA44BD, &H534929FB,&H82724FD8, &H80006204 ' 1018!
      !dd &HC2CE33E7, &H84E10E86,&H81CF40F4, &H8000620E ' 1019!
      !dd &H3C0B65B3, &H905C2D78,&H814D71B3, &H80006218 ' 1020!
      !dd &H21DE5D27, &H49AFE856,&H80EC779E, &H80006222 ' 1021!
      !dd &HF6CD6DF8, &H7A8B1061,&H80AC0162, &H8000622C ' 1022!
      !dd &HDE4FBA9D, &H21EC6D9D,&H808BD662, &H80006236 ' 1023!
      !dd &HDE4FBA9D, &H21EC6D9D,&H808BD662, &H80006240 ' 1024!
      !dd &H45C74E8B, &HBA74E8B9,&H80ABF957, &H8000624A ' 1025!
      !dd &HA26A3233, &H6652232D,&H80EC4F54, &H80006254 ' 1026!
      !dd &H04A401D8, &HE59EE0C8,&H814D008F, &H8000625E ' 1027!
      !dd &HCCA8A5DA, &H75847FA8,&H81CE4D90, &H80006268 ' 1028!
      !dd &H5FA878AA, &H6A176548,&H82708F71, &H80006272 ' 1029!
      !dd &H4C37F55F, &H94368860,&H83343848, &H8000627C ' 1030!
      !dd &HF4BD574C, &H1339E7CE,&H8419D3AB, &H80006286 ' 1031!
      !dd &H92A6D1FB, &H69605B9E,&H85220752, &H80006290 ' 1032!
      !dd &HB770C953, &HE2CD746C,&H864D93E2, &H8000629A ' 1033!
      !dd &HC73B634A, &H9A04760F,&H879D55D4, &H800062A4 ' 1034!
      !dd &H729F469B, &HA2AC0254,&H89124680, &H800062AE ' 1035!
      !dd &H6FF7246F, &H2494065B,&H8AAD7D54, &H800062B8 ' 1036!
      !dd &H192307A6, &H760AE770,&H8C70312B, &H800062C2 ' 1037!
      !dd &H217B0240, &H8E280D9A,&H8E5BB9D7, &H800062CC ' 1038!
      !dd &H23788F89, &H767D23CD,&H907191D0, &H800062D6 ' 1039!
      !dd &H580671C7, &HB857185C,&H92B35817, &H800062E0 ' 1040!
      !dd &HE07C8D2A, &H1D268A83,&H9522D24E, &H800062EA ' 1041!
      !dd &H31EEBDA6, &H7CA9B7F3,&H97C1EF00, &H800062F4 ' 1042!
      !dd &HF51BEBAB, &HBEF9DE1C,&H9A92C82F, &H800062FE ' 1043!
      !dd &H85E57745, &HADB4BF73,&H9D97A618, &H80006308 ' 1044!
      !dd &HA4646BF7, &HAF44B460,&HA0D30240, &H80006312 ' 1045!
      !dd &HB7EC9449, &H1308AE40,&HA4478ACD, &H8000631C ' 1046!
      !dd &HAC0E249D, &H2E36202A,&HA7F8262B, &H80006326 ' 1047!
      !dd &HAC167979, &H314B64EB,&HABE7F710, &H80006330 ' 1048!
      !dd &H6D0A05F0, &H567F7C22,&HB01A60D8, &H8000633A ' 1049!
      !dd &H4CCEC717, &HD4B1B8C9,&HB4930C4D, &H80006344 ' 1050!
      !dd &H9B953AD7, &HE20D6868,&HB955ECE0, &H8000634E ' 1051!
      !dd &H77D64F73, &H083BC643,&HBE67465B, &H80006358 ' 1052!
      !dd &HE0FB2133, &H1C3777A0,&HC3CBB319, &H80006362 ' 1053!
      !dd &H17927CAC, &H588B17A2,&HC9882AD8, &H8000636C ' 1054!
      !dd &H3FC92BF2, &H65394D99,&HCFA20A24, &H80006376 ' 1055!
      !dd &H09C77551, &H88631806,&HD61F1A75, &H80006380 ' 1056!
      !dd &H3B9822D9, &HD208498C,&HDD059B0F, &H8000638A ' 1057!
      !dd &H6392B002, &HD8818FFD,&HE45C4AB5, &H80006394 ' 1058!
      !dd &H4CB9F386, &H8FA7FDA9,&HEC2A7243, &H8000639E ' 1059!
      !dd &H406C7D15, &HEFB4E594,&HF477F047, &H800063A8 ' 1060!
      !dd &HDBC0689A, &H891E2EDF,&HFD4D45B6, &H800063B2 ' 1061!
      !dd &H9534063E, &H679A66CE,&H8359D1E6, &H800063BD ' 1062!
      !dd &HF362C17B, &HEE0C8838,&H885A7DA4, &H800063C7 ' 1063!
      !dd &H2CE49D0A, &H5F59058B,&H8DAE068D, &H800063D1 ' 1064!
      !dd &HFF70C453, &H886A5603,&H935A3E50, &H800063DB ' 1065!
      !dd &H296AE461, &HD602B28B,&H996571DE, &H800063E5 ' 1066!
      !dd &H81682178, &HF17F4F8A,&H9FD67466, &H800063EF ' 1067!
      !dd &H74F79AE8, &H5DDFC7F5,&HA6B4AB67, &H800063F9 ' 1068!
      !dd &HFE5B7C77, &HA8BFDD7E,&HAE081BEF, &H80006403 ' 1069!
      !dd &H32C8988E, &HECD47BF2,&HB5D97930, &H8000640D ' 1070!
      !dd &H909D4D8E, &HEBB33CA2,&HBE323480, &H80006417 ' 1071!
      !dd &H2F64AD31, &HF6BFA37A,&HC71C8EF6, &H80006421 ' 1072!
      !dd &HC8293E7B, &H480E4F0C,&HD0A3ACCE, &H8000642B ' 1073!
      !dd &HE7EF4208, &H5A9301E8,&HDAD3AABE, &H80006435 ' 1074!
      !dd &H417C6C92, &H5595D441,&HE5B9B57F, &H8000643F ' 1075!
      !dd &H91CFBE15, &HCCEE7008,&HF16423B6, &H80006449 ' 1076!
      !dd &H035BBEAC, &H0309C755,&HFDE29290, &H80006453 ' 1077!
      !dd &HFF848A9D, &H4D9965AB,&H85A302A5, &H8000645E ' 1078!
      !dd &HFC7DE90F, &HAE8462E1,&H8CD08409, &H80006468 ' 1079!
      !dd &H584CCBCE, &H360FA04A,&H9483EB42, &H80006472 ' 1080!
      !dd &H7BB71226, &HA591FEF6,&H9CC8431A, &H8000647C ' 1081!
      !dd &H71B8F0AD, &HA7F2C3E7,&HA5A99AE7, &H80006486 ' 1082!
      !dd &H0786588B, &H80E000B1,&HAF352094, &H80006490 ' 1083!
      !dd &H66F737BB, &H346D20BB,&HB9793D7D, &H8000649A ' 1084!
      !dd &H90D971CD, &HE9CCA0EE,&HC485B666, &H800064A4 ' 1085!
      !dd &H029E9C31, &H24F484AD,&HD06BCEF2, &H800064AE ' 1086!
      !dd &HA787DE4D, &H8ABA8FD6,&HDD3E70ED, &H800064B8 ' 1087!
      !dd &H12005C32, &H636638D4,&HEB1257FC, &H800064C2 ' 1088!
      !dd &H8824E20C, &H28B575EF,&HF9FE4212, &H800064CC ' 1089!
      !dd &HBC35A14F, &H2A2A9404,&H850D92AA, &H800064D7 ' 1090!
      !dd &H0B86239D, &HCC6CDD34,&H8DC23602, &H800064E1 ' 1091!
      !dd &H804A0BFA, &HFC0017E4,&H972C1B98, &H800064EB ' 1092!
      !dd &HA5EF0949, &H0AFB1980,&HA15BD475, &H800064F5 ' 1093!
      !dd &HF146E06B, &H0B3B43BE,&HAC639B7B, &H800064FF ' 1094!
      !dd &H6E818A7B, &HD3429FB1,&HB8578382, &H80006509 ' 1095!
      !dd &HE846A637, &H061D4EEB,&HC54DAAC2, &H80006513 ' 1096!
      !dd &H3995AF91, &H5B0CE5CC,&HD35E742E, &H8000651D ' 1097!
      !dd &H7BBF00C1, &HB4A15467,&HE2A4C793, &H80006527 ' 1098!
      !dd &H100F3E0F, &HC61C2556,&HF33E5931, &H80006531 ' 1099!
      !dd &HB9A02FD5, &H3BE81E0D,&H82A5FCE8, &H8000653C ' 1100!
      !dd &H41D57B6E, &HB2695250,&H8C78F82C, &H80006546 ' 1101!
      !dd &H5ED93E54, &H1A005815,&H972C2F14, &H80006550 ' 1102!
      !dd &H04EA80E3, &HE701DEE1,&HA2D5D7B5, &H8000655A ' 1103!
      !dd &H994CD2F5, &H1D0E044A,&HAF8E8C90, &H80006564 ' 1104!
      !dd &H7FED26A5, &H835A6021,&HBD71932E, &H8000656E ' 1105!
      !dd &H2EABA43D, &HBCDF1CD4,&HCC9D2B77, &H80006578 ' 1106!
      !dd &H61740DCD, &HB16E326A,&HDD32E8BD, &H80006582 ' 1107!
      !dd &H1B7292EF, &H40FC3C8D,&HEF5815D5, &H8000658C ' 1108!
      !dd &HE8FCEAD1, &H9A509649,&H819B12D2, &H80006597 ' 1109!
      !dd &H1E0E2889, &H4A465AE9,&H8C7D98E7, &H800065A1 ' 1110!
      !dd &H6C5BDC7B, &HF0D5D522,&H986D44A4, &H800065AB ' 1111!
      !dd &H61ABC16E, &H1D883573,&HA586A88B, &H800065B5 ' 1112!
      !dd &HA8E8EEFD, &H34D94C18,&HB3E99CB1, &H800065BF ' 1113!
      !dd &HD3C167FF, &HC7FE6548,&HC3B9A4F6, &H800065C9 ' 1114!
      !dd &H0C92D7FC, &HB64440C9,&HD51E645F, &H800065D3 ' 1115!
      !dd &H1CB40964, &H4FA4629B,&HE8441F64, &H800065DD ' 1116!
      !dd &HB30F633E, &H2BE0108F,&HFD5C4F3E, &H800065E7 ' 1117!
      !dd &H71FFA66D, &H3073910A,&H8A4F2442, &H800065F2 ' 1118!
      !dd &H2A131E1E, &H547249BF,&H9723FBDF, &H800065FC ' 1119!
      !dd &H1604E8F1, &H445D00A9,&HA54F5B7C, &H80006606 ' 1120!
      !dd &H1A5AE002, &HC9D6CFF9,&HB4F81FE6, &H80006610 ' 1121!
      !dd &H71609272, &H6027DEE0,&HC649DEF4, &H8000661A ' 1122!
      !dd &HA456A89A, &H8073B9AC,&HD9758342, &H80006624 ' 1123!
      !dd &H80631F11, &HFEFF06CE,&HEEB1FD13, &H8000662E ' 1124!
      !dd &H2F4672F1, &H1BF2D71D,&H831E85A5, &H80006639 ' 1125!
      !dd &H977BF764, &H0E3B878A,&H902E0FF5, &H80006643 ' 1126!
      !dd &HC838AF86, &HF46A046C,&H9EAEB20F, &H8000664D ' 1127!
      !dd &HD48E715A, &H933CC8DF,&HAECC7025, &H80006657 ' 1128!
      !dd &HC81A0C79, &H6D95C478,&HC0B8E6A5, &H80006661 ' 1129!
      !dd &H48D0BEC4, &H8D6DC54F,&HD4AC0A85, &H8000666B ' 1130!
      !dd &H51AC8EB3, &H01F4FDAD,&HEAE5049F, &H80006675 ' 1131!
      !dd &H4CA4E0E0, &HE394EA37,&H81D5960D, &H80006680 ' 1132!
      !dd &HAF8D6DD0, &HDE0E8425,&H8FA79246, &H8000668A ' 1133!
      !dd &HBBE91F1B, &H7AE91357,&H9F16127D, &H80006694 ' 1134!
      !dd &H7E87A43B, &H94FBD730,&HB054B6FE, &H8000669E ' 1135!
      !dd &HCC5E7A31, &H6D4762B9,&HC39DFB02, &H800066A8 ' 1136!
      !dd &HCD2BE72D, &H71D6835E,&HD93429F5, &H800066B2 ' 1137!
      !dd &HDB034A6A, &H4502E4FE,&HF16278A1, &H800066BC ' 1138!
      !dd &H3D0DF482, &HB0C17C1B,&H863F23D6, &H800066C7 ' 1139!
      !dd &H52F88935, &H02C7672A,&H95744AE6, &H800066D1 ' 1140!
      !dd &HE8F36EE3, &HCA98AFB3,&HA687D474, &H800066DB ' 1141!
      !dd &H244B7C2A, &H3FF147F3,&HB9B87B70, &H800066E5 ' 1142!
      !dd &HA5C341D8, &H8B5F920F,&HCF4DABC8, &H800066EF ' 1143!
      !dd &H7B30238F, &H0BB4C52D,&HE798C5EA, &H800066F9 ' 1144!
      !dd &H0D7F49E1, &H79CB70BD,&H817B49A6, &H80006704 ' 1145!
      !dd &H939AF42F, &HCF4E2DAB,&H90E879EC, &H8000670E ' 1146!
      !dd &HEF95D103, &H0134D1A7,&HA2506692, &H80006718 ' 1147!
      !dd &H4598F552, &HAF5A370B,&HB5F822FD, &H80006722 ' 1148!
      !dd &H65D7E145, &H2701FA43,&HCC2EAD43, &H8000672C ' 1149!
      !dd &HB0DFF17D, &HEA4EB88E,&HE54E6B94, &H80006736 ' 1150!
      !dd &H31A7DBD8, &H512EFDF9,&H80DF72B6, &H80006741 ' 1151!
      !dd &H57DCD753, &H1B54DDB8,&H90FB610D, &H8000674B ' 1152!
      !dd &HD0EE6973, &H02064EA6,&HA33F0C07, &H80006755 ' 1153!
      !dd &HFE74ADD6, &HE5C81BA2,&HB7F88D0D, &H8000675F ' 1154!
      !dd &H18821B14, &H6CED752C,&HCF819919, &H80006769 ' 1155!
      !dd &HC7AAE091, &HB3F81146,&HEA414DD5, &H80006773 ' 1156!
      !dd &H9C8CE91E, &HDACC04C2,&H84572498, &H8000677E ' 1157!
      !dd &H1409599F, &HDB6DB762,&H95A88BE2, &H80006788 ' 1158!
      !dd &H422D9530, &H03DB6E4F,&HA9638454, &H80006792 ' 1159!
      !dd &HC8F7A300, &H2C5E92F5,&HBFE2BBE7, &H8000679C ' 1160!
      !dd &H2B1AC48F, &HDA0E3A1F,&HD98ED18A, &H800067A6 ' 1161!
      !dd &H5E69E00D, &H107124F4,&HF6E090C8, &H800067B0 ' 1162!
      !dd &H451D5F9B, &H9C56405C,&H8C31C637, &H800067BB ' 1163!
      !dd &HE29063AD, &H36B60B28,&H9F5C9451, &H800067C5 ' 1164!
      !dd &H43C2C567, &H657E9C32,&HB54E13BD, &H800067CF ' 1165!
      !dd &H3C2847C7, &H2911AADB,&HCE72677A, &H800067D9 ' 1166!
      !dd &H59CEE7CD, &H784DE277,&HEB46E16D, &H800067E3 ' 1167!
      !dd &H11380033, &H6E9C6B28,&H862E6C90, &H800067EE ' 1168!
      !dd &H7DA82E3A, &HE2461154,&H992E7F6F, &H800067F8 ' 1169!
      !dd &H0992A8D1, &H56090ECD,&HAF05A09B, &H80006802 ' 1170!
      !dd &HF8B2768D, &HA2A2DBAC,&HC825AF69, &H8000680C ' 1171!
      !dd &HF8A441B0, &HE724656C,&HE51321C3, &H80006816 ' 1172!
      !dd &H89E9141F, &HD4433897,&H83341536, &H80006821 ' 1173!
      !dd &HBC9CB892, &H5C5B1161,&H966C3652, &H8000682B ' 1174!
      !dd &HE62CD4C9, &H01797F31,&HAC9AAB55, &H80006835 ' 1175!
      !dd &H4E577C5F, &H9FB18813,&HC639A0C3, &H8000683F ' 1176!
      !dd &H30CC0EB4, &HDA4DCEA8,&HE3D7BD08, &H80006849 ' 1177!
      !dd &H3E115F75, &H5791411E,&H830DD77B, &H80006854 ' 1178!
      !dd &H91F680A8, &H43127DB9,&H96E42FD9, &H8000685E ' 1179!
      !dd &HD7330E42, &H5C4A4EE0,&HADE0F323, &H80006868 ' 1180!
      !dd &HD031A232, &H8830B378,&HC889B06A, &H80006872 ' 1181!
      !dd &HF4514AB8, &HF8343729,&HE77AEF22, &H8000687C ' 1182!
      !dd &H5C007509, &H531F295D,&H85B622E2, &H80006887 ' 1183!
      !dd &HF2608753, &HB01C07D3,&H9A9A9855, &H80006891 ' 1184!
      !dd &H053C3499, &H290C700F,&HB2E966C9, &H8000689B ' 1185!
      !dd &H65903AEC, &HFC0AE7C9,&HCF37538B, &H800068A5 ' 1186!
      !dd &HB47AF04D, &H8469A42E,&HF0336218, &H800068AF ' 1187!
      !dd &H17B15064, &H38CF47BD,&H8B55CE67, &H800068BA ' 1188!
      !dd &H4FC2A299, &H5AB6AE0C,&HA1C961E9, &H800068C4 ' 1189!
      !dd &H4EB0AFF4, &HAEEB4B43,&HBC038748, &H800068CE ' 1190!
      !dd &H88C600A6, &HC9722AC9,&HDAAD1A98, &H800068D8 ' 1191!
      !dd &H99367CC2, &HDA7EE5CE,&HFE8D80F5, &H800068E2 ' 1192!
      !dd &HF8FFDD6C, &H36E72B9D,&H94482DBF, &H800068ED ' 1193!
      !dd &HB2D657AF, &H75848C5B,&HACE62957, &H800068F7 ' 1194!
      !dd &H02F3A2D3, &HD0646ECC,&HC9C598BE, &H80006901 ' 1195!
      !dd &H47728F2D, &HDD654D68,&HEBA9C966, &H8000690B ' 1196!
      !dd &H12C254EF, &HBF26555E,&H89BD1C56, &H80006916 ' 1197!
      !dd &H8EF25A5D, &H7CA158DF,&HA124BEA7, &H80006920 ' 1198!
      !dd &HC3A0454F, &H9C2DEBCF,&HBCAEC63C, &H8000692A ' 1199!
      !dd &H793FD138, &H0705D057,&HDD1CD04F, &H80006934 ' 1200!
      !dd &H4BFA8C91, &H57FE48CD,&H81AA85A8, &H8000693F ' 1201!
      !dd &HFBAF9A00, &H1B49FC74,&H9834A9E4, &H80006949 ' 1202!
      !dd &H6EAE8C2C, &HBB0F2B56,&HB2CFDE96, &H80006953 ' 1203!
      !dd &HA0233ACF, &H39F0D5F4,&HD23E68B7, &H8000695D ' 1204!
      !dd &H1D7174F5, &H9CEEA7C6,&HF767F0B9, &H80006967 ' 1205!
      !dd &HE9D68F9F, &H4D29894B,&H91B07501, &H80006972 ' 1206!
      !dd &H3AE0A7CA, &H48B3B595,&HABB9BDEA, &H8000697C ' 1207!
      !dd &H0B7505F0, &H61C40036,&HCA951E0A, &H80006986 ' 1208!
      !dd &HCF06EA42, &HC1EDA93F,&HEF2E8EB7, &H80006990 ' 1209!
      !dd &HF310D5E8, &H1153AA3E,&H8D5041D2, &H8000699B ' 1210!
      !dd &HF1F428F8, &H2DFDB195,&HA71EA9D7, &H800069A5 ' 1211!
      !dd &H795FFC7D, &HAF6F4530,&HC5CD4B05, &H800069AF ' 1212!
      !dd &HABC6F3D8, &H7C108EB5,&HEA4F6F1E, &H800069B9 ' 1213!
      !dd &H30932F0B, &H520AD098,&H8AE4961E, &H800069C4 ' 1214!
      !dd &H93A2A311, &H79D85500,&HA4CCB91E, &H800069CE ' 1215!
      !dd &HAF5121A5, &H30B0E4F0,&HC3B31BD4, &H800069D8 ' 1216!
      !dd &H0C5C2C3C, &HEEDE3C17,&HE8959DD2, &H800069E2 ' 1217!
      !dd &HB519D14F, &HB28FAB3C,&H8A52FB1C, &H800069ED ' 1218!
      !dd &H84967BEA, &H69908718,&HA4AA486E, &H800069F7 ' 1219!
      !dd &H35F749A2, &H8BC530F4,&HC42EE04B, &H80006A01 ' 1220!
      !dd &H31591C8D, &H1468E09F,&HE9ECE4F2, &H80006A0B ' 1221!
      !dd &HFCB1EBC9, &H71AD9406,&H8B94199B, &H80006A16 ' 1222!
      !dd &H584D7F5B, &H67050F8B,&HA6B42195, &H80006A20 ' 1223!
      !dd &H8F8CA23B, &H95240C94,&HC7435024, &H80006A2A ' 1224!
      !dd &HB8B9FD13, &HC36A600C,&HEE60469F, &H80006A34 ' 1225!
      !dd &H9D9556C0, &H23BB6DFF,&H8EB32247, &H80006A3F ' 1226!
      !dd &H0A12B1B2, &HBE10D60E,&HAAFD2552, &H80006A49 ' 1227!
      !dd &HD6146B19, &H39EE30B2,&HCD0D93C2, &H80006A53 ' 1228!
      !dd &HA3700189, &HDC071FF2,&HF61A8B96, &H80006A5D ' 1229!
      !dd &HF9A884EC, &HDAA5476F,&H93CE7155, &H80006A68 ' 1230!
      !dd &HDC6055CB, &HF59830A0,&HB1AF6CBE, &H80006A72 ' 1231!
      !dd &H8923E738, &HBF7B1A81,&HD5C70ED5, &H80006A7C ' 1232!
      !dd &H3CB0BD95, &H6FE7FD55,&H80B477CE, &H80006A87 ' 1233!
      !dd &H37A2FC76, &H45DB10C9,&H9B197A60, &H80006A91 ' 1234!
      !dd &HADD9D1FB, &H9C3FF47E,&HBB0EFA57, &H80006A9B ' 1235!
      !dd &HE7D7EA74, &HBF99321C,&HE1C9142B, &H80006AA5 ' 1236!
      !dd &HB588C9FC, &HEC99E7E4,&H886013CE, &H80006AB0 ' 1237!
      !dd &H0178E032, &HAB0C11DB,&HA4E027F2, &H80006ABA ' 1238!
      !dd &HBD080145, &HDE75DA9A,&HC77E3855, &H80006AC4 ' 1239!
      !dd &H60E7B18A, &HFB62B6B7,&HF192D837, &H80006ACE ' 1240!
      !dd &HDE986575, &HEC3430F7,&H92621B44, &H80006AD9 ' 1241!
      !dd &HA37BD70E, &H187D4D64,&HB18BFE13, &H80006AE3 ' 1242!
      !dd &HE972934C, &HADFA19B1,&HD784AEA9, &H80006AED ' 1243!
      !dd &H914D1879, &H112D6A9B,&H82E91818, &H80006AF8 ' 1244!
      !dd &HA468FC01, &H42E277DD,&H9F29E68B, &H80006B02 ' 1245!
      !dd &H318DBEA3, &H73E290DA,&HC1AB7C06, &H80006B0C ' 1246!
      !dd &HB5D85CE7, &HDB9F27E5,&HEBD89448, &H80006B16 ' 1247!
      !dd &HFACFD89D, &H65D4FC4F,&H8FB7FA5C, &H80006B21 ' 1248!
      !dd &H8DAC03F5, &H333508C0,&HAF4C271F, &H80006B2B ' 1249!
      !dd &H0CF07AD5, &H96023D2F,&HD5FC75C1, &H80006B35 ' 1250!
      !dd &H9D876508, &H20019E1F,&H82B6166E, &H80006B40 ' 1251!
      !dd &HA79A8A86, &HA521FA54,&H9FD0A16C, &H80006B4A ' 1252!
      !dd &H1615DA01, &H310FD390,&HC38E0986, &H80006B54 ' 1253!
      !dd &HF30BC278, &HD514E194,&HEF7A70A9, &H80006B5E ' 1254!
      !dd &H266FD4CB, &H12732BBC,&H92C027CA, &H80006B69 ' 1255!
      !dd &HC7252B01, &HDAA143A4,&HB3FFB0CD, &H80006B73 ' 1256!
      !dd &H0575600B, &HB1A07549,&HDCF49EC8, &H80006B7D ' 1257!
      !dd &H1A9A593E, &HC71BD00B,&H87B94288, &H80006B88 ' 1258!
      !dd &HA6F5453A, &HAACD7209,&HA6DF068D, &H80006B92 ' 1259!
      !dd &HE06FCC2E, &H512ACB51,&HCD546D10, &H80006B9C ' 1260!
      !dd &H93A1AC2F, &H57F3F2E0,&HFCDA374E, &H80006BA6 ' 1261!
      !dd &HE2F8DFDA, &H86B292E9,&H9BCF7794, &H80006BB1 ' 1262!
      !dd &HF9B27619, &H7122C0B3,&HC02D23BD, &H80006BBB ' 1263!
      !dd &H283849C7, &HD7A6E5DE,&HED37B81D, &H80006BC5 ' 1264!
      !dd &HD897C492, &H6ED3F6BB,&H92860A99, &H80006BD0 ' 1265!
      !dd &H3D47A287, &HB1850E8B,&HB526B81A, &H80006BDA ' 1266!
      !dd &HC8126258, &H072561BE,&HE023A84B, &H80006BE4 ' 1267!
      !dd &H9EDF61E4, &H73ECA504,&H8AC613B2, &H80006BEF ' 1268!
      !dd &HF9E2540F, &HE629037F,&HABF9F7E8, &H80006BF9 ' 1269!
      !dd &H386A3341, &H5973DDD7,&HD54A84F7, &H80006C03 ' 1270!
      !dd &HF122E88F, &H01A3C84C,&H845E9F45, &H80006C0E ' 1271!
      !dd &H93895CE2, &HB80972CF,&HA46D89D7, &H80006C18 ' 1272!
      !dd &H8D2983B8, &H6C89BEFA,&HCC692C9C, &H80006C22 ' 1273!
      !dd &HB8A02660, &H9D09601A,&HFE50DA00, &H80006C2C ' 1274!
      !dd &HA2B0B3E4, &H21C3B634,&H9E5395B8, &H80006C37 ' 1275!
      !dd &H96BA3029, &H7212E00B,&HC54A2790, &H80006C41 ' 1276!
      !dd &H73B7B08F, &HE24209E6,&HF608B9D6, &H80006C4B ' 1277!
      !dd &H8EB5E06D, &HD7B0B5AD,&H9987F1F7, &H80006C56 ' 1278!
      !dd &H86FFAB11, &H4FA6F6EB,&HBFC38C79, &H80006C60 ' 1279!
      !dd &H68BF95D5, &HA390B4A6,&HEFB46F97, &H80006C6A ' 1280!
      !dd &H9644D598, &HB92EE2FE,&H95EEBC4C, &H80006C75 ' 1281!
      !dd &HBB212D68, &H0DD7332F,&HBBB562BE, &H80006C7F ' 1282!
      !dd &H0DB5D1A5, &H9FD76162,&HEB2F8377, &H80006C89 ' 1283!
      !dd &HF9987DF0, &H7FB6888D,&H937349EC, &H80006C94 ' 1284!
      !dd &H29769C09, &H0743CEDC,&HB9086C84, &H80006C9E ' 1285!
      !dd &H7E1274F5, &HCF1FA849,&HE8601447, &H80006CA8 ' 1286!
      !dd &H2F19D940, &HA04904E1,&H920760BE, &H80006CB3 ' 1287!
      !dd &H3D3E8342, &HC59BD823,&HB7AD47AF, &H80006CBD ' 1288!
      !dd &H5BD7F0BA, &H027F6CD2,&HE735DF7D, &H80006CC7 ' 1289!
      !dd &H8059C461, &H7DD2C34B,&H91A2AF05, &H80006CD2 ' 1290!
      !dd &H70112C55, &H2C6177B7,&HB79BDA28, &H80006CDC ' 1291!
      !dd &H7265AAF0, &HAFFEFA0C,&HE7A9A440, &H80006CE6 ' 1292!
      !dd &H1BB9700C, &H571D5A9E,&H92427A53, &H80006CF1 ' 1293!
      !dd &HCC08D517, &H50959802,&HB8D30194, &H80006CFB ' 1294!
      !dd &H89882B7B, &H50E92EFD,&HE9BCD93F, &H80006D05 ' 1295!
      !dd &H71082B84, &H11338FBC,&H93E9817A, &H80006D10 ' 1296!
      !dd &H6E2A991E, &HDC498ECE,&HBB58823E, &H80006D1A ' 1297!
      !dd &HAAA4FF17, &HAE3B3D84,&HED79B118, &H80006D24 ' 1298!
      !dd &H05BC674C, &H0782D325,&H96A00FB4, &H80006D2F ' 1299!
      !dd &H00482F23, &H8D89160E,&HBF3933EF, &H80006D39 ' 1300!
      !dd &H49DBB5E4, &H1A926B45,&HF2F36D3C, &H80006D43 ' 1301!
      !dd &H4CB46DE3, &HF5E495B2,&H9A7441B1, &H80006D4E ' 1302!
      !dd &HA11A96D3, &H32A39D7B,&HC4896E98, &H80006D58 ' 1303!
      !dd &H6F27DC11, &HD07C5A8B,&HFA4702D5, &H80006D62 ' 1304!
      !dd &H1934461A, &H7E793D32,&H9F7A7FAE, &H80006D6D ' 1305!
      !dd &H65252B68, &H0C4DA08C,&HCB65BBD8, &H80006D77 ' 1306!
      !dd &H990C9894, &H00DA0A55,&H81CE0CC1, &H80006D82 ' 1307!
      !dd &H567F16E5, &H88168333,&HA5CE324A, &H80006D8C ' 1308!
      !dd &H6051F604, &HC676C737,&HD3F3D5C9, &H80006D96 ' 1309!
      !dd &HABDC6D1D, &HD0B279ED,&H879337FF, &H80006DA1 ' 1310!
      !dd &H08C774B2, &HC3707F9A,&HAD92BAF1, &H80006DAB ' 1311!
      !dd &H5B3F8D84, &HC268237D,&HDE63FF85, &H80006DB5 ' 1312!
      !dd &HBE201E9A, &HA14303C0,&H8E93DC31, &H80006DC0 ' 1313!
      !dd &HD3F83745, &HAF6E7E50,&HB6F4BC0D, &H80006DCA ' 1314!
      !dd &H4C3500FA, &H930924B6,&HEAF2C87E, &H80006DD4 ' 1315!
      !dd &H23F80F20, &H557B6017,&H96F901D5, &H80006DDF ' 1316!
      !dd &HC302C974, &HA030ED55,&HC22BC19B, &H80006DE9 ' 1317!
      !dd &HE280164B, &HCEAEF979,&HF9EB51B1, &H80006DF3 ' 1318!
      !dd &H5FC03E5C, &H63FCF0EC,&HA0F56E3D, &H80006DFE ' 1319!
      !dd &HB36DD062, &H22E40E90,&HCF7C601B, &H80006E08 ' 1320!
      !dd &H15BC3509, &H80E159E5,&H85D5197D, &H80006E13 ' 1321!
      !dd &H408F7A79, &H86E2EE8E,&HACC79D68, &H80006E1D ' 1322!
      !dd &H49E95F7B, &HCC45B1B6,&HDF3AE69E, &H80006E27 ' 1323!
      !dd &H58C85F3A, &HA90F0E63,&H90509417, &H80006E32 ' 1324!
      !dd &H0CA14538, &H9D80BB5E,&HBABC439F, &H80006E3C ' 1325!
      !dd &H495AD522, &H307432A0,&HF1CEC991, &H80006E46 ' 1326!
      !dd &H9B87BADA, &HF3454A4D,&H9CADDCDA, &H80006E51 ' 1327!
      !dd &HA5B40652, &HF37DDC5C,&HCB317A6B, &H80006E5B ' 1328!
      !dd &H9F07729A, &H4D620C9F,&H83DB7B91, &H80006E66 ' 1329!
      !dd &H520D2C59, &H3901D965,&HAB4291FE, &H80006E70 ' 1330!
      !dd &H72669F65, &H30992752,&HDE9AC743, &H80006E7A ' 1331!
      !dd &H1F67BEAB, &H331B9C13,&H90C7AA99, &H80006E85 ' 1332!
      !dd &HE4A1CCF4, &HEDC7B0EB,&HBC77EAD3, &H80006E8F ' 1333!
      !dd &H4E58C880, &H1643A4FB,&HF586386B, &H80006E99 ' 1334!
      !dd &H50B21FB3, &HCE23582B,&HA00BDE06, &H80006EA4 ' 1335!
      !dd &H8348655B, &HE0F21D08,&HD0CF7BAC, &H80006EAE ' 1336!
      !dd &H2EB4A32B, &H3C5A0F34,&H8851739D, &H80006EB9 ' 1337!
      !dd &HAF070734, &HF35BACDD,&HB21E6D90, &H80006EC3 ' 1338!
      !dd &HE09E70AB, &H4A38204A,&HE8E949C5, &H80006ECD ' 1339!
      !dd &HFDF7AAB8, &H960FB920,&H9864A3C4, &H80006ED8 ' 1340!
      !dd &H74969651, &H31841730,&HC791CB77, &H80006EE2 ' 1341!
      !dd &H0065AD00, &H5AB24E32,&H82C5C913, &H80006EED ' 1342!
      !dd &H140559A4, &H22335A0E,&HAB82E677, &H80006EF7 ' 1343!
      !dd &H7A4705A8, &H5CE36632,&HE11BCE7C, &H80006F01 ' 1344!
      !dd &HE68DE497, &H6C80D77D,&H93D662FB, &H80006F0C ' 1345!
      !dd &HFD8D82F8, &H7C1F5B40,&HC2534D1B, &H80006F16 ' 1346!
      !dd &HBD87E608, &HE7863F49,&HFF9F13AD, &H80006F20 ' 1347!
      !dd &H093FF2E8, &HF6E3DCA8,&HA8403473, &H80006F2B ' 1348!
      !dd &H5E2F7EC0, &HC4FFAE70,&HDDA69519, &H80006F35 ' 1349!
      !dd &H9215CECD, &HBC9B8A3C,&H921B8EC8, &H80006F40 ' 1350!
      !dd &H69BC4597, &H56D635A1,&HC0C3DBA1, &H80006F4A ' 1351!
      !dd &H1D9A93E2, &H04A6D2CF,&HFE8297FB, &H80006F54 ' 1352!
      !dd &H146EBEF3, &HB572B605,&HA82406A7, &H80006F5F ' 1353!
      !dd &HB7846F7C, &HC16C2DAD,&HDE53A2CC, &H80006F69 ' 1354!
      !dd &HCF4B3F43, &H3878F2B8,&H931895D6, &H80006F74 ' 1355!
      !dd &HBA80A4C5, &HACC8296A,&HC2C98E6A, &H80006F7E ' 1356!
      !dd &H57D37D2D, &H6EBC2071,&H8110CCFD, &H80006F89 ' 1357!
      !dd &H4FF8F881, &H185A7D06,&HAB29C7DA, &H80006F93 ' 1358!
      !dd &H20A2ABCE, &HB1D2176D,&HE328B2FB, &H80006F9D ' 1359!
      !dd &H77AC0617, &H2415838E,&H96D906DB, &H80006FA8 ' 1360!
      !dd &H1A8E6317, &HC2B5981A,&HC87DF35C, &H80006FB2 ' 1361!
      !dd &H5C293166, &H707D4467,&H8555C318, &H80006FBD ' 1362!
      !dd &H93EBD481, &HC7BABCCC,&HB179E76E, &H80006FC7 ' 1363!
      !dd &H81092210, &H900BBD7C,&HEC676146, &H80006FD1 ' 1364!
      !dd &H1B80B654, &HA7C1D32B,&H9D906735, &H80006FDC ' 1365!
      !dd &H01303339, &H13490F32,&HD23021AE, &H80006FE6 ' 1366!
      !dd &H808B0C31, &H111F6404,&H8C4BE07B, &H80006FF1 ' 1367!
      !dd &H03B9C249, &H68DFEF9E,&HBB6D5DE4, &H80006FFB ' 1368!
      !dd &H007B17FE, &H9D356219,&HFA92F6C6, &H80007005 ' 1369!
      !dd &H399257CD, &H5CA9F5DF,&HA79ECF94, &H80007010 ' 1370!
      !dd &H9E54AF0D, &HE3108DF0,&HE06BE06B, &H8000701A ' 1371!
      !dd &HB211BB45, &H469D9716,&H965844D8, &H80007025 ' 1372!
      !dd &H2E424659, &HFCAECCD5,&HC995DA4E, &H8000702F ' 1373!
      !dd &H05C8F6B2, &H7E0645EC,&H873E4936, &H8000703A ' 1374!
      !dd &HACC49941, &HEBB8EC63,&HB599E2CE, &H80007044 ' 1375!
      !dd &HF0282DF0, &H0CC07DA5,&HF406C8C6, &H8000704E ' 1376!
      !dd &H321903E3, &H2952EC7B,&HA4130FBE, &H80007059 ' 1377!
      !dd &HC8EAA9BB, &H669C173B,&HDCCBA6AF, &H80007063 ' 1378!
      !dd &HE1690209, &H5AB75A24,&H94ABA05C, &H8000706E ' 1379!
      !dd &HB3C683BE, &H7641187B,&HC85B4B1C, &H80007078 ' 1380!
      !dd &H6A19BC96, &H113DA522,&H871A8F86, &H80007083 ' 1381!
      !dd &HF231BC05, &H7044B25D,&HB65658B3, &H8000708D ' 1382!
      !dd &H61DAABB0, &H58E0C7E6,&HF6431E4C, &H80007097 ' 1383!
      !dd &HB020C606, &H980FE716,&HA66B5B79, &H800070A2 ' 1384!
      !dd &H6FB853D5, &H35EB824E,&HE116B479, &H800070AC ' 1385!
      !dd &H951B7EBC, &H07BDA1EF,&H98549DA3, &H800070B7 ' 1386!
      !dd &H4336FDE9, &H92BC1B17,&HCE549C84, &H800070C1 ' 1387!
      !dd &H440DC516, &HD9727C5C,&H8BD65813, &H800070CC ' 1388!
      !dd &H274FAD95, &HECB48B30,&HBDAE7EF8, &H800070D6 ' 1389!
      !dd &HEEAE5410, &H72A78977,&H80BD2EAD, &H800070E1 ' 1390!
      !dd &HAA794EB1, &H1C7F14FC,&HAEE0FC28, &H800070EB ' 1391!
      !dd &H77BCE6F9, &H86BCC087,&HEDB9D6C6, &H800070F5 ' 1392!
      !dd &H24515C9A, &HC8652274,&HA1B20735, &H80007100 ' 1393!
      !dd &H1B70C28F, &HB74DAD67,&HDC1EDAD0, &H8000710A ' 1394!
      !dd &H1B50EE86, &HEADB88FD,&H95EF844B, &H80007115 ' 1395!
      !dd &H0E3D552D, &H7F2D49C1,&HCC67875B, &H8000711F ' 1396!
      !dd &H5056963A, &HC9A0446F,&H8B6E1EB4, &H8000712A ' 1397!
      !dd &HF82E3618, &HD1444D6D,&HBE5AD6EB, &H80007134 ' 1398!
      !dd &H7EE89134, &H56938864,&H82084D90, &H8000713F ' 1399!
      !dd &H6581F685, &H565DB479,&HB1C75A0B, &H80007149 ' 1400!
      !dd &H17210F87, &H02E9B42B,&HF33AFEF2, &H80007153 ' 1401!
      !dd &H7F9561E1, &H2C7E7C96,&HA6822307, &H8000715E ' 1402!
      !dd &H334DEBDB, &H14364D33,&HE422CD7E, &H80007168 ' 1403!
      !dd &H99ABEB31, &HEEDB39EC,&H9C65DBDF, &H80007173 ' 1404!
      !dd &HE1D92273, &H007A4B39,&HD696C1EF, &H8000717D ' 1405!
      !dd &HFCCCD166, &HD493F524,&H9351FFA3, &H80007188 ' 1406!
      !dd &H925A6CB8, &H5B564C15,&HCA6BEB01, &H80007192 ' 1407!
      !dd &HD49E2ABF, &HEECB544E,&H8B2A3190, &H8000719D ' 1408!
      !dd &H780EA251, &HAC9346C1,&HBF7CCEB3, &H800071A7 ' 1409!
      !dd &HB2E81340, &H33906576,&H83D5AD4F, &H800071B2 ' 1410!
      !dd &H4F054887, &HE24D37CF,&HB5A8AE8E, &H800071BC ' 1411!
      !dd &HDBF64902, &H060C79F4,&HFA7D98B3, &H800071C6 ' 1412!
      !dd &H9042CC1F, &H840C5BA4,&HACD2E77A, &H800071D1 ' 1413!
      !dd &HBD343CDD, &HAD57108B,&HEEA53AA3, &H800071DB ' 1414!
      !dd &H8C59778D, &HD663878E,&HA4E268E3, &H800071E6 ' 1415!
      !dd &H1E13B751, &H0E75A173,&HE401150B, &H800071F0 ' 1416!
      !dd &HC62F6436, &H46612354,&H9DC13FAF, &H800071FB ' 1417!
      !dd &HE470A045, &H36F5836C,&HDA741AB0, &H80007205 ' 1418!
      !dd &H92C7890C, &HD8145BEF,&H975C31FD, &H80007210 ' 1419!
      !dd &H388AB30B, &H02A43B7D,&HD1E4D953, &H8000721A ' 1420!
      !dd &HC25B3C7B, &H38B533C6,&H91A2694A, &H80007225 ' 1421!
      !dd &H82E5B27C, &H91BFA166,&HCA3D0936, &H8000722F ' 1422!
      !dd &H1A335964, &HCA850645,&H8C8528C6, &H8000723A ' 1423!
      !dd &H186F684F, &H71A0FCB8,&HC3692CB4, &H80007244 ' 1424!
      !dd &H98008474, &H0D9023D7,&H87F78E3B, &H8000724F ' 1425!
      !dd &HBB2CB874, &H3C6339E9,&HBD583D91, &H80007259 ' 1426!
      !dd &H3BCB4906, &H1273A37A,&H83EE5BE6, &H80007264 ' 1427!
      !dd &H75627CD5, &HD7BB42F9,&HB7FB6627, &H8000726E ' 1428!
      !dd &H4F87D85A, &H8CE7099B,&H805FCA27, &H80007279 ' 1429!
      !dd &H639034A2, &H3B44A3EA,&HB345C4CE, &H80007283 ' 1430!
      !dd &HCCA2C58D, &H33532C10,&HFA86BFC7, &H8000728D ' 1431!
      !dd &HBF15D021, &H48E327CF,&HAF2C3818, &H80007298 ' 1432!
      !dd &H79284683, &HFBFFE276,&HF523A17F, &H800072A2 ' 1433!
      !dd &H7455735F, &HDD32EB51,&HABA532D4, &H800072AD ' 1434!
      !dd &H65C6BF6D, &HCCFB1B44,&HF089C0FB, &H800072B7 ' 1435!
      !dd &H755CDB39, &H8E3A119E,&HA8A896D0, &H800072C2 ' 1436!
      !dd &H9E328EA4, &H2B96FD39,&HECAE95A4, &H800072CC ' 1437!
      !dd &H34D3FFA8, &H059B444D,&HA62F9592, &H800072D7 ' 1438!
      !dd &H7EFCEA84, &HF360F13B,&HE9895E6F, &H800072E1 ' 1439!
      !dd &HD549D4E5, &HB720299D,&HA4349666, &H800072EC ' 1440!
      !dd &H5B6525D7, &H0B330290,&HE71300A6, &H800072F6 ' 1441!
      !dd &H2459F7E5, &HE962AA8E,&HA2B32134, &H80007301 ' 1442!
      !dd &HCDB9C813, &H4FE1C9D7,&HE545ED0B, &H8000730B ' 1443!
      !dd &HA88D7D92, &H79D2B2D0,&HA1A7CDA2, &H80007316 ' 1444!
      !dd &HF1D9A972, &H866892D4,&HE41E0AED, &H80007320 ' 1445!
      !dd &HD9C26E63, &H34A655AB,&HA1103637, &H8000732B ' 1446!
      !dd &H96F67F7D, &H82A60B8F,&HE398A89C, &H80007335 ' 1447!
      !dd &H85BC4823, &HA85F662C,&HA0EAEF36, &H80007340 ' 1448!
      !dd &H803DAD14, &H17C0FE54,&HE3B470FF, &H8000734A ' 1449!
      !dd &H53CBAACA, &H9B916411,&HA1378100, &H80007355 ' 1450!
      !dd &H8D7CD842, &H9C70448B,&HE471660B, &H8000735F ' 1451!
      !dd &HF0D00353, &H3B699898,&HA1F665D9, &H8000736A ' 1452!
      !dd &H03B328B7, &H7D8D95C7,&HE5D0E004, &H80007374 ' 1453!
      !dd &H0AE07228, &H30234516,&HA3290B0B, &H8000737F ' 1454!
      !dd &H11F46A34, &H25A61D6A,&HE7D59171, &H80007389 ' 1455!
      !dd &H68C3C381, &H70C418E9,&HA4D1D566, &H80007394 ' 1456!
      !dd &H1B508AED, &H01F30472,&HEA838FE3, &H8000739E ' 1457!
      !dd &H3BF216E7, &H5C2341EA,&HA6F4292F, &H800073A9 ' 1458!
      !dd &H7CE92E22, &H3A873C2A,&HEDE061AE, &H800073B3 ' 1459!
      !dd &H4A0C3B63, &HB4B96864,&HA99475A2, &H800073BE ' 1460!
      !dd &H16A5F3BB, &H64598831,&HF1F310D6, &H800073C8 ' 1461!
      !dd &H0AEAF7BE, &H0C22E9F9,&HACB84445, &H800073D3 ' 1462!
      !dd &H8F593373, &HA616E1C7,&HF6C44389, &H800073DD ' 1463!
      !dd &HA778C3C7, &H65BA5B65,&HB0664C47, &H800073E8 ' 1464!
      !dd &H2ED88618, &H2549DD42,&HFC5E5AA1, &H800073F2 ' 1465!
      !dd &HA0087DFD, &HD9F11FA1,&HB4A68A5F, &H800073FD ' 1466!
      !dd &H6602153F, &H68BD1808,&H8166CB5E, &H80007408 ' 1467!
      !dd &H0A3CFC75, &H58271574,&HB9825D8C, &H80007412 ' 1468!
      !dd &H5BD7FE95, &HCABB08C3,&H85102259, &H8000741D ' 1469!
      !dd &H725891F8, &HE6877F14,&HBF04A94F, &H80007427 ' 1470!
      !dd &HCFA15DD8, &H43B49266,&H8933791C, &H80007432 ' 1471!
      !dd &HCA77F6E6, &HA1539273,&HC539FE18, &H8000743C ' 1472!
      !dd &H87FF8874, &H77083BB5,&H8DDA55E1, &H80007447 ' 1473!
      !dd &HCE4353EB, &H0BD759F2,&HCC30C89F, &H80007451 ' 1474!
      !dd &H3F4DBD91, &H8C273968,&H930FA27D, &H8000745C ' 1475!
      !dd &H433F0E3D, &HF70489BF,&HD3F98936, &H80007466 ' 1476!
      !dd &H8FDF59A5, &H43E5A5D7,&H98DFD695, &H80007471 ' 1477!
      !dd &HA228DFE4, &H717FF6DE,&HDCA71438, &H8000747B ' 1478!
      !dd &H075B44B0, &H42F74968,&H9F5928BA, &H80007486 ' 1479!
      !dd &H5AA1E946, &H34C96818,&HE64EDCDD, &H80007490 ' 1480!
      !dd &H9C8A55D1, &H76CC2566,&HA68BC777, &H8000749B ' 1481!
      !dd &H018E3532, &H656E7421,&HF1094C2E, &H800074A5 ' 1482!
      !dd &H668059C5, &H18B2DB57,&HAE8A1B8A, &H800074B0 ' 1483!
      !dd &HA98C0219, &H21CB33DF,&HFCF225E9, &H800074BA ' 1484!
      !dd &H0D502505, &H2B20F77D,&HB76914BD, &H800074C5 ' 1485!
      !dd &HFC68E6DD, &H420B2B92,&H85147ECC, &H800074D0 ' 1486!
      !dd &HB209553F, &H1CE7B886,&HC1408321, &H800074DA ' 1487!
      !dd &HDD5AC7F0, &H0F005C11,&H8C68DF46, &H800074E5 ' 1488!
      !dd &HFA1F413A, &H9F5045E0,&HCC2B7EA9, &H800074EF ' 1489!
      !dd &HEDF93D35, &HE82826D6,&H948AA4E6, &H800074FA ' 1490!
      !dd &H7300A7DE, &H3688768D,&HD848DF9B, &H80007504 ' 1491!
      !dd &H0C47FA4C, &H933A6A5E,&H9D9116E6, &H8000750F ' 1492!
      !dd &H9F67F1AF, &HAE28EB95,&HE5BBCAA3, &H80007519 ' 1493!
      !dd &H6609138E, &HE74C59DB,&HA796BE12, &H80007524 ' 1494!
      !dd &H1037C04D, &H192FB830,&HF4AC5400, &H8000752E ' 1495!
      !dd &H1BD8B978, &H1265DB8B,&HB2B9E15C, &H80007539 ' 1496!
      !dd &H0EBACA92, &H6CF2B41A,&H82A41EDA, &H80007544 ' 1497!
      !dd &H1E8C4156, &H88610C78,&HBF1D1722, &H8000754E ' 1498!
      !dd &H6B5BE853, &HE6920880,&H8BE1EACE, &H80007559 ' 1499!
      !dd &H1D43A151, &H13BFEA74,&HCCE7EEF5, &H80007563 ' 1500!
      !dd &H59F2B11B, &H5E998835,&H962D7C82, &H8000756E ' 1501!
      !dd &H416F7AC7, &H39C2334A,&HDC47B821, &H80007578 ' 1502!
      !dd &H1EC5B03B, &H62436564,&HA1A92241, &H80007583 ' 1503!
      !dd &H0D325AD7, &H0852FCEB,&HED706A50, &H8000758D ' 1504!
      !dd &H3B12A101, &H101DFC1C,&HAE7C3C20, &H80007598 ' 1505!
      !dd &HC27072E5, &H93DA0CA3,&H804EDB36, &H800075A3 ' 1506!
      !dd &H0066FD16, &H9217261A,&HBCD40D1C, &H800075AD ' 1507!
      !dd &H254BD55B, &H89920B8E,&H8B0A23A7, &H800075B8 ' 1508!
      !dd &H38760028, &HA37A7787,&HCCE4B10A, &H800075C2 ' 1509!
      !dd &HF2E1009E, &H98088BA0,&H97119D88, &H800075CD ' 1510!
      !dd &HBE6382A9, &H4E569C08,&HDEEA3E34, &H800075D7 ' 1511!
      !dd &H748F7777, &H9DD5F132,&HA492EFEC, &H800075E2 ' 1512!
      !dd &HCCB8FA43, &H5C355BA0,&HF32A1AFF, &H800075EC ' 1513!
      !dd &H9F57BF02, &H46EA71FC,&HB3C2E075, &H800075F7 ' 1514!
      !dd &H405F88EC, &HC155AE12,&H84FA48CA, &H80007602 ' 1515!
      !dd &H054D6FB6, &H2C39D8B5,&HC4DE89C4, &H8000760C ' 1516!
      !dd &H160D7BDF, &HEF425925,&H91D356CB, &H80007617 ' 1517!
      !dd &H7A30FD21, &H512EDB26,&HD82CCB2B, &H80007621 ' 1518!
      !dd &H29E115BF, &HC0D6A0CB,&HA0563930, &H8000762C ' 1519!
      !dd &H922A1C47, &H5E3E96AD,&HEDFFFCE4, &H80007636 ' 1520!
      !dd &HA82D8640, &H1A7E3BA7,&HB0C1BDB1, &H80007641 ' 1521!
      !dd &H58BBD505, &HDDF04FD5,&H835BFB38, &H8000764C ' 1522!
      !dd &H8FB95D14, &HD4172ABC,&HC35F0DE4, &H80007656 ' 1523!
      !dd &H50F36FC3, &HC7D33D4D,&H91623BD6, &H80007661 ' 1524!
      !dd &H64CE8A31, &H9D17570B,&HD8838B9D, &H8000766B ' 1525!
      !dd &HBD5CE578, &HB0CD241B,&HA1540447, &H80007676 ' 1526!
      !dd &H5DA14730, &HE7E5E898,&HF0930961, &H80007680 ' 1527!
      !dd &HADDB541D, &H0C048889,&HB37DB400, &H8000768B ' 1528!
      !dd &HC9EC5F2C, &H88F8E26F,&H86013902, &H80007696 ' 1529!
      !dd &H0733AC33, &H49A7DE54,&HC838D3AE, &H800076A0 ' 1530!
      !dd &H10E240DB, &H6A4FDDD4,&H95AD7B3E, &H800076AB ' 1531!
      !dd &H45427F08, &H610D7CE0,&HDFEE8B62, &H800076B5 ' 1532!
      !dd &H5FD7E656, &H83E5B899,&HA79EEF15, &H800076C0 ' 1533!
      !dd &HC313ED8E, &HBB16A209,&HFB1A9728, &H800076CA ' 1534!
      !dd &H11168FAD, &HA73996B3,&HBC348E0B, &H800076D5 ' 1535!
      !dd &H4CD0EBC2, &HBD6B3106,&H8D276A88, &H800076E0 ' 1536!
      !dd &HB4CC95DD, &HBE502455,&HD3DE69A7, &H800076EA ' 1537!
      !dd &H5D06A38B, &H38ABAF49,&H9F1BC6D8, &H800076F5 ' 1538!
      !dd &H828FBA4C, &H772C07B1,&HEF20FF19, &H800076FF ' 1539!
      !dd &HFAAD1396, &HA61C9BC8,&HB3D04FD2, &H8000770A ' 1540!
      !dd &H199E7ADD, &HE03D46B8,&H874C9E0F, &H80007715 ' 1541!
      !dd &H3A942603, &HE82C45FE,&HCBBDE004, &H8000771F ' 1542!
      !dd &HEA625E24, &HB26C5B3B,&H9980AE27, &H8000772A ' 1543!
      !dd &H576851F2, &HDB076190,&HE7740697, &H80007734 ' 1544!
      !dd &H03F092D2, &H4F1BF17A,&HAE9B6779, &H8000773F ' 1545!
      !dd &H5B795AD5, &H52F7D809,&H83CECFDC, &H8000774A ' 1546!
      !dd &H22F195F9, &H1A57EDA0,&HC720B086, &H80007754 ' 1547!
      !dd &H8A699ADC, &H5CE9761C,&H9683356D, &H8000775F ' 1548!
      !dd &HAC603F81, &HAECC27EA,&HE3ADFA91, &H80007769 ' 1549!
      !dd &HDBF5D810, &HC20B0335,&HAC50EC63, &H80007774 ' 1550!
      !dd &H69F4CF01, &H0C94170E,&H827FC906, &H8000777F ' 1551!
      !dd &HD89709BD, &H2B1072F1,&HC5C9ACAD, &H80007789 ' 1552!
      !dd &HA45D8843, &HD047D929,&H95FB8E10, &H80007794 ' 1553!
      !dd &HB1EFF149, &H8415090F,&HE39C4118, &H8000779E ' 1554!
      !dd &H4ABA8ED4, &HFD4978C1,&HACD1C3EC, &H800077A9 ' 1555!
      !dd &HDB46BD84, &H8E70523E,&H834D5F5B, &H800077B4 ' 1556!
      !dd &H12E94FA9, &HF654490E,&HC7A5653D, &H800077BE ' 1557!
      !dd &H74E2FD5A, &HE3249E93,&H97E112C4, &H800077C9 ' 1558!
      !dd &HFF349538, &H40D1006C,&HE73AEA53, &H800077D3 ' 1559!
      !dd &H06650DA9, &H6A5F3353,&HB021E07D, &H800077DE ' 1560!
      !dd &HA83FC60A, &H97B3CFFE,&H863FD23B, &H800077E9 ' 1561!
      !dd &HF3A54796, &HE6E7C8C5,&HCCC85A2F, &H800077F3 ' 1562!
      !dd &H12D24382, &H4ED924DA,&H9C4967D4, &H800077FE ' 1563!
      !dd &H12BF251B, &H446DA749,&HEEB41D95, &H80007808 ' 1564!
      !dd &H36F350BB, &H306A4AF5,&HB668631B, &H80007813 ' 1565!
      !dd &H00C48CFB, &H0A4546D1,&H8B7A51C8, &H8000781E ' 1566!
      !dd &H54ECC6BD, &HDDB7831E,&HD5706EA5, &H80007828 ' 1567!
      !dd &H39054829, &HFDC08063,&HA36A14B6, &H80007833 ' 1568!
      !dd &H081E57D1, &H624E34B8,&HFA634A3D, &H8000783D ' 1569!
      !dd &H143942D2, &H8E9C73EA,&HBFF29DA9, &H80007848 ' 1570!
      !dd &HAF436CA2, &HF0C5436A,&H933DBBB0, &H80007853 ' 1571!
      !dd &HC70E81C4, &HA19ED47E,&HE209C522, &H8000785D ' 1572!
      !dd &HDFA3846B, &HB9629DF5,&HAD9CC109, &H80007868 ' 1573!
      !dd &HB7A0EC05, &H393A8AE6,&H856E395C, &H80007873 ' 1574!
      !dd &H5CEFC305, &H9905CB24,&HCD3A48B9, &H8000787D ' 1575!
      !dd &HFB848113, &HD2C17552,&H9DEDD9F6, &H80007888 ' 1576!
      !dd &H0BD8CFC8, &H5E126EEF,&HF3378CEC, &H80007892 ' 1577!
      !dd &HAFE0CE19, &H1F7BB3F9,&HBB668D55, &H8000789D ' 1578!
      !dd &HA1F9F2E6, &H8125FFE2,&H907C3137, &H800078A8 ' 1579!
      !dd &HAFECA9C9, &HA445A1D2,&HDEEF9FF0, &H800078B2 ' 1580!
      !dd &H450F1292, &H24D0410C,&HAC19BBD8, &H800078BD ' 1581!
      !dd &H3A586498, &H366FDE3F,&H84F0E0DA, &H800078C8 ' 1582!
      !dd &H3E722582, &H55A76FD2,&HCD835F99, &H800078D2 ' 1583!
      !dd &H9C4C4903, &H983F807C,&H9EF39BF0, &H800078DD ' 1584!
      !dd &HE0ED1403, &H27A84AA0,&HF608921F, &H800078E7 ' 1585!
      !dd &H162F98BF, &HA07613CB,&HBE882328, &H800078F2 ' 1586!
      !dd &H7F5121FD, &H9B577F96,&H93A4BE3E, &H800078FD ' 1587!
      !dd &H6370D1B5, &H16E6B0DC,&HE4F67B07, &H80007907 ' 1588!
      !dd &HFEA768B5, &H6024BCF8,&HB1A5BD34, &H80007912 ' 1589!
      !dd &H4FB4788B, &H69A485B6,&H89EB6CA4, &H8000791D ' 1590!
      !dd &H0256A64A, &H73235EC0,&HD649880C, &H80007927 ' 1591!
      !dd &H41D15B43, &HAD807EA7,&HA69328C1, &H80007932 ' 1592!
      !dd &HD911F81D, &HA6149283,&H81913713, &H8000793D ' 1593!
      !dd &H3D6678B9, &H16070612,&HC9B08C3C, &H80007947 ' 1594!
      !dd &H7491AE45, &H4BA7B85A,&H9D13DF37, &H80007952 ' 1595!
      !dd &HFBAF0E9D, &H2EEA6854,&HF4D1F8E7, &H8000795C ' 1596!
      !dd &H44C261C5, &H45F5899B,&HBEE83BB7, &H80007967 ' 1597!
      !dd &HE6E6ABCA, &H40D6561E,&H94F5B498, &H80007972 ' 1598!
      !dd &HC10EB2C0, &HBF3EB0FA,&HE89AACC0, &H8000797C ' 1599!
      !dd &HE6D37BA6, &H9568FA43,&HB5B8D6F6, &H80007987 ' 1600!
      !dd &H54D21309, &H838CB0A4,&H8E0F1F0B, &H80007992 ' 1601!
      !dd &H16B2A6C8, &H834D9A59,&HDE3EA811, &H8000799C ' 1602!
      !dd &H7B24154B, &HB525DDAF,&HADF44ACC, &H800079A7 ' 1603!
      !dd &HEFF1C2AD, &H53E0281F,&H883DD495, &H800079B2 ' 1604!
      !dd &H0ED5AE62, &H0DB716E4,&HD58AE973, &H800079BC ' 1605!
      !dd &H56A2107F, &HF9015333,&HA774AE90, &H800079C7 ' 1606!
      !dd &HE89A6AB2, &H0162EA28,&H8365AE7A, &H800079D2 ' 1607!
      !dd &H3D427B8B, &H962D53B4,&HCE55ABFB, &H800079DC ' 1608!
      !dd &HFAA0DB50, &H085C5C62,&HA21B0EBE, &H800079E7 ' 1609!
      !dd &H9F0DE8D1, &HC8253741,&HFEDF8AAD, &H800079F1 ' 1610!
      !dd &H3E7D9103, &H73504657,&HC87D17B6, &H800079FC ' 1611!
      !dd &HABAFD5A4, &H1BC3AF5D,&H9DCE762A, &H80007A07 ' 1612!
      !dd &H4CB0B947, &HD43BFDFC,&HF89377A1, &H80007A11 ' 1613!
      !dd &H95704603, &HC9024769,&HC3E63787, &H80007A1C ' 1614!
      !dd &H62B7E936, &H33A2AC10,&H9A7B2B0A, &H80007A27 ' 1615!
      !dd &HDBCA3C09, &H197CB789,&HF3CA5FEC, &H80007A31 ' 1616!
      !dd &HB8A90CA7, &H499F9869,&HC07C28FC, &H80007A3C ' 1617!
      !dd &H86238E3F, &H512A5629,&H98121761, &H80007A47 ' 1618!
      !dd &H26D4B726, &H1D13AFBA,&HF06E9A77, &H80007A51 ' 1619!
      !dd &HBFB742DF, &H38801280,&HBE2F7D2F, &H80007A5C ' 1620!
      !dd &H27BE6D4E, &H80185EA5,&H96885675, &H80007A67 ' 1621!
      !dd &H9A742223, &H1E6699EA,&HEE70F4F3, &H80007A71 ' 1622!
      !dd &HCB26C88E, &H2AB78F39,&HBCF5C41E, &H80007A7C ' 1623!
      !dd &HD417C108, &HEBDF8E92,&H95D6E283, &H80007A87 ' 1624!
      !dd &H8112B213, &HD90F8400,&HEDC840F5, &H80007A91 ' 1625!
      !dd &H667A17E2, &H3095918D,&HBCC93D93, &H80007A9C ' 1626!
      !dd &HB5493EB9, &HCEB8D281,&H95FA5F4A, &H80007AA7 ' 1627!
      !dd &H373772B8, &HEEA7D6AC,&HEE710D7F, &H80007AB1 ' 1628!
      !dd &HBB6B7AA0, &HE2344020,&HBDA8AC5C, &H80007ABC ' 1629!
      !dd &H0D2ACAD9, &HED09160A,&H96F2FF2E, &H80007AC7 ' 1630!
      !dd &H8278E897, &HFE0B38DA,&HF06D89F2, &H80007AD1 ' 1631!
      !dd &H1FF85958, &HA270F14E,&HBF9749ED, &H80007ADC ' 1632!
      !dd &H6B3DE63D, &H9B264E68,&H98C481D2, &H80007AE7 ' 1633!
      !dd &H9F2045E5, &H9092A01D,&HF3C59128, &H80007AF1 ' 1634!
      !dd &HA5E963CD, &HC26B0E93,&HC29CD9C2, &H80007AFC ' 1635!
      !dd &HF208F039, &H144E8524,&H9B764BF4, &H80007B07 ' 1636!
      !dd &H4FECCA07, &HF1768659,&HF886DCEB, &H80007B11 ' 1637!
      !dd &HEEACA295, &HB55F8BF3,&HC6C5DD31, &H80007B1C ' 1638!
      !dd &HD7A2689D, &H2806D720,&H9F139965, &H80007B27 ' 1639!
      !dd &H995A1B8C, &H021AF48A,&HFEC563AC, &H80007B31 ' 1640!
      !dd &H8E205352, &H332FD931,&HCC23E97D, &H80007B3C ' 1641!
      !dd &HFB336ACE, &HA14A1CE2,&HA3ABCAF3, &H80007B47 ' 1642!
      !dd &H98465FCF, &H3384D4EC,&H834DF1F1, &H80007B52 ' 1643!
      !dd &HD878FBD1, &H3DB641D7,&HD2CE236E, &H80007B5C ' 1644!
      !dd &HFF402D44, &H6C5184A2,&HA952D335, &H80007B67 ' 1645!
      !dd &H00A5D461, &H2FCE845A,&H88165140, &H80007B72 ' 1646!
      !dd &HC28AB857, &HFCE4695F,&HDAE1E52E, &H80007B7C ' 1647!
      !dd &H0E8BA056, &HCF7FCCCB,&HB021C66B, &H80007B87 ' 1648!
      !dd &HFF162C79, &H8E72C6C4,&H8DD131E3, &H80007B92 ' 1649!
      !dd &H6D073AAA, &H2B07F148,&HE48394E3, &H80007B9C ' 1650!
      !dd &HC2E4B3EA, &HA1D08722,&HB8379326, &H80007BA7 ' 1651!
      !dd &H8A357B21, &HA986B501,&H9498D432, &H80007BB2 ' 1652!
      !dd &HBC5AD502, &HC828B3B0,&HEFDFB48A, &H80007BBC ' 1653!
      !dd &HFC1E5B88, &H1526DF1E,&HC1B9EB0F, &H80007BC7 ' 1654!
      !dd &H29FD0837, &HD037C98E,&H9C8D1DD3, &H80007BD2 ' 1655!
      !dd &HE7E73349, &H8ABA37F3,&HFD2C363C, &H80007BDC ' 1656!
      !dd &H3700EF5F, &HBBBDEA85,&HCCD66561, &H80007BE7 ' 1657!
      !dd &H58C781C9, &H5F3D801C,&HA5D49193, &H80007BF2 ' 1658!
      !dd &HF66A9CC3, &HC14671A6,&H8655116C, &H80007BFD ' 1659!
      !dd &HA976D41F, &H4D51323D,&HD9C3E73F, &H80007C07 ' 1660!
      !dd &H4290FFCA, &HB714FA5F,&HB09D826C, &H80007C12 ' 1661!
      !dd &HCE452B94, &HB993462E,&H8F53D297, &H80007C1D ' 1662!
      !dd &H837CD586, &HE7A0ED3A,&HE8C46141, &H80007C27 ' 1663!
      !dd &H8AD56D7D, &H8C32C0BF,&HBD1F8F05, &H80007C32 ' 1664!
      !dd &HB8BEC3A3, &H629AC2F3,&H99C14826, &H80007C3D ' 1665!
      !dd &H86125D4B, &H736CCA2D,&HFA26F5E2, &H80007C47 ' 1666!
      !dd &HCE0132B0, &H32B3AD10,&HCB9D7664, &H80007C52 ' 1667!
      !dd &H2FC7F9C8, &H9B4B5674,&HA5D5BEEC, &H80007C5D ' 1668!
      !dd &H6F7057EF, &H920E4554,&H872550B7, &H80007C68 ' 1669!
      !dd &H33BDB768, &H60B24611,&HDC675B23, &H80007C72 ' 1670!
      !dd &H49176B05, &H7D8574EB,&HB3D4D47C, &H80007C7D ' 1671!
      !dd &H16AC1E5F, &HA279F474,&H92D0C179, &H80007C88 ' 1672!
      !dd &HAA0AB49F, &HF9B3BFA2,&HEFDD9018, &H80007C92 ' 1673!
      !dd &HB57D4023, &H6A1A2C63,&HC40FDA08, &H80007C9D ' 1674!
      !dd &H0C8F5054, &HA1C7280E,&HA05A76F2, &H80007CA8 ' 1675!
      !dd &H7F47483D, &H8F647B47,&H833A0857, &H80007CB3 ' 1676!
      !dd &HD7317D0E, &H65954EE4,&HD6E8CA29, &H80007CBD ' 1677!
      !dd &HFF50CC36, &H6AFB1563,&HB0153BA3, &H80007CC8 ' 1678!
      !dd &H5AF05D6B, &H99549829,&H905B6844, &H80007CD3 ' 1679!
      !dd &HD9325943, &H8B8EC9A3,&HECD5F710, &H80007CDD ' 1680!
      !dd &H9CA67384, &H748C9341,&HC2651F6A, &H80007CE8 ' 1681!
      !dd &HA2E7B460, &H2E3873F0,&H9FA78D0D, &H80007CF3 ' 1682!
      !dd &HDFDF28DA, &HB4DBA446,&H83335089, &H80007CFE ' 1683!
      !dd &H8E29FE2F, &H766D3528,&HD7C36372, &H80007D08 ' 1684!
      !dd &H7DF74CC1, &H0CAF99DC,&HB18521B2, &H80007D13 ' 1685!
      !dd &H44B35670, &H53F18FEA,&H9224597D, &H80007D1E ' 1686!
      !dd &H32AE73A7, &H390B36D8,&HF0C3626E, &H80007D28 ' 1687!
      !dd &H31C5C953, &HD9043E34,&HC6710A20, &H80007D33 ' 1688!
      !dd &HCB8C3DA8, &H56F99FCC,&HA3A7F97A, &H80007D3E ' 1689!
      !dd &HBEF779E1, &H34457D1D,&H870C5C9E, &H80007D49 ' 1690!
      !dd &HDF1B2C84, &H40D1C05C,&HDF03A9F2, &H80007D53 ' 1691!
      !dd &HBA52F347, &HA48D4A6C,&HB83F86E7, &H80007D5E ' 1692!
      !dd &H2186D25C, &H3D674CA6,&H984F83E5, &H80007D69 ' 1693!
      !dd &HD47688FF, &HBB14634C,&HFBF78AB1, &H80007D73 ' 1694!
      !dd &H36579AA2, &HD8B57FAF,&HD0897FE9, &H80007D7E ' 1695!
      !dd &H19008C0E, &HA7764DBD,&HACB1DDED, &H80007D89 ' 1696!
      !dd &H5057940D, &H8C62E72A,&H8F18E204, &H80007D94 ' 1697!
      !dd &HAA393900, &H8ACA0051,&HED48C2C8, &H80007D9E ' 1698!
      !dd &HBF9738A9, &H1E235403,&HC4D93C97, &H80007DA9 ' 1699!
      !dd &H1C890689, &H7084533D,&HA36652CB, &H80007DB4 ' 1700!
      !dd &HA1D34F0D, &H3853E7A2,&H87B6DC84, &H80007DBF ' 1701!
      !dd &HCFF8B7E4, &HC39F7580,&HE1926F85, &H80007DC9 ' 1702!
      !dd &H7CEFF1EA, &H5B0B38D5,&HBB92A47C, &H80007DD4 ' 1703!
      !dd &HA0F3A448, &H77C05649,&H9C1102DB, &H80007DDF ' 1704!
      !dd &H0C1ED624, &HF611FFD6,&H81EDA980, &H80007DEA ' 1705!
      !dd &H1B315FC3, &H59F4FCBA,&HD87672E5, &H80007DF4 ' 1706!
      !dd &H9E6A4731, &HE9DA9225,&HB46BBA03, &H80007DFF ' 1707!
      !dd &H5F9DA260, &H4387C8E2,&H9677D7A2, &H80007E0A ' 1708!
      !dd &HCE13D53E, &H8F345E03,&HFB1F82A1, &H80007E14 ' 1709!
      !dd &HAD510F4D, &H6551F97F,&HD1AD8F52, &H80007E1F ' 1710!
      !dd &H8AEC18A8, &HF665DC51,&HAF2CE01C, &H80007E2A ' 1711!
      !dd &H2A215C9D, &H35F9262C,&H926F8358, &H80007E35 ' 1712!
      !dd &H617A4F2D, &H504A0A1B,&HF4F70B78, &H80007E3F ' 1713!
      !dd &H6A549CC3, &H7131F6F5,&HCD03C159, &H80007E4A ' 1714!
      !dd &HC2EA9AC6, &H462A372D,&HABAE0509, &H80007E55 ' 1715!
      !dd &HD7D192AF, &H454A5F3B,&H8FD94F38, &H80007E60 ' 1716!
      !dd &H17A02734, &H1A2EF42F,&HF1332015, &H80007E6A ' 1717!
      !dd &H811198E3, &HB3B6E356,&HCA55A329, &H80007E75 ' 1718!
      !dd &H3B95A533, &HA0B82211,&HA9D4A153, &H80007E80 ' 1719!
      !dd &H790AADBE, &H3BFAA49C,&H8EA1937D, &H80007E8B ' 1720!
      !dd &HFA6E3281, &H3A0DFF27,&HEFB70E21, &H80007E95 ' 1721!
      !dd &H5D5127F7, &H701044CA,&HC98EAAA1, &H80007EA0 ' 1722!
      !dd &HC04226FF, &H91A7AFDF,&HA99266CD, &H80007EAB ' 1723!
      !dd &HDA57AFD4, &H0C1CA88C,&H8EBEBD8A, &H80007EB6 ' 1724!
      !dd &H46D036F2, &HCCE746EF,&HF076D0CA, &H80007EC0 ' 1725!
      !dd &H27EDFA4E, &HEA2FEA08,&HCAA82276, &H80007ECB ' 1726!
      !dd &HA0ABCD73, &H06BB2779,&HAAE48810, &H80007ED6 ' 1727!
      !dd &H9F90F559, &H85ADE94E,&H9030D2CD, &H80007EE1 ' 1728!
      !dd &H00EC8243, &H84F6E52F,&HF3766FEF, &H80007EEB ' 1729!
      !dd &HF487C909, &H14118F18,&HCDA8CC0E, &H80007EF6 ' 1730!
      !dd &HB7AE448B, &H66365752,&HADD38B78, &H80007F01 ' 1731!
      !dd &H7456E0F8, &H5270F4D9,&H93016773, &H80007F0C ' 1732!
      !dd &H0424083B, &HEB45AA61,&HF8CA2053, &H80007F16 ' 1733!
      !dd &HA44181F8, &H0D733C01,&HD2A522DF, &H80007F21 ' 1734!
      !dd &HE406FEFB, &HB684FF75,&HB273A5EA, &H80007F2C ' 1735!
      !dd &HEE49EE23, &HF4B6BC8A,&H974407A3, &H80007F37 ' 1736!
      !dd &H555A7419, &HEEED7CA9,&H804B92FA, &H80007F42 ' 1737!
      !dd &H675E060D, &HE6861415,&HD9C044F6, &H80007F4C ' 1738!
      !dd &HACA57663, &H25FE194D,&HB8E5A28F, &H80007F57 ' 1739!
      !dd &H7E2E9415, &H9EC7627F,&H9D17199C, &H80007F62 ' 1740!
      !dd &HA1A458A3, &HC47A3F1B,&H858AC325, &H80007F6D ' 1741!
      !dd &H817B14C9, &HBFBDF65B,&HE32D8EFA, &H80007F77 ' 1742!
      !dd &H20D2A050, &HA7EFCC0B,&HC158660F, &H80007F82 ' 1743!
      !dd &H79F35C84, &H550233C1,&HA4A546E9, &H80007F8D ' 1744!
      !dd &H3A087B34, &H8F8E8059,&H8C49530B, &H80007F98 ' 1745!
      !dd &H23737613, &H364679D8,&HEF330619, &H80007FA2 ' 1746!
      !dd &HBF3D9DD8, &HC1AC5E2F,&HCC0B2653, &H80007FAD ' 1747!
      !dd &HC0BA1739, &H7CCD9E63,&HAE278436, &H80007FB8 ' 1748!
      !dd &HF076EC15, &H08551963,&H94BA7F49, &H80007FC3 ' 1749!
      !dd &H4B733C76, &H4FBD6EE4,&HFE2CB887, &H80007FCD ' 1750!
      !dd &H70022651, &HB04D162F,&HD9507C44, &H80007FD8 ' 1751!
      !dd &H94D1D6C8, &HC2D1F1FA,&HB9E7DA4E, &H80007FE3 ' 1752!
      !dd &H9CA21CF8, &HAA81F43F,&H9F2094BC, &H80007FEE ' 1753!
      !dd &H7AE5D74F, &H9507CC6F,&H8848A762, &H80007FF9 ' 1754!
      !dd &H00000000, &H00000000,&H80000000, &H81007FFF ' Infinity
      ________________
      Mark Longley-Cook
      Last edited by Mark Longley-Cook; 9 Feb 2009, 12:04 PM.

      Comment


      • #4
        96-bit Significand Powers of two and ten

        Edit of 2/9/09 allowed for a reduced size array of powers of ten. Edit of 2/12/09 corrected not having a Reset statement for Case 0 in PowerOfTen96A(). (Significant edits in this thread will be noted in the first paragraph so please check there -- it is a work in progress.)

        The following function for integer powers of two has been incorporated into the initial post and is repeated here for convenience:

        Code:
        Function PowerOfTwo96T(y As Type96, n As Long) As Ext
            ' y=2^n Integer power of two
            Dim y96(3) As Dword At VarPtr(y)
            Function=PowerOfTwo96A(y96(), n)
        End Function
         
        Function PowerOfTwo96A(y() As Dword, _ ' Output array
            n As Long) As Ext                  ' Input integer power of two
            ' y <-- 2^n
            Call CheckOut96A(y())
            Local i As Long
            Reset y()
            Bit Set y(0),%FlagSig96
            Select Case n
            Case <-16477 ' Zero
                Bit Set y(0),%FlagZer96
            Case -16477 To -16383 ' Denormal
                ' -16477 To -16446 are zero in extended-precision
                Bit Set y(0),%FlagDen96
                Bit Set y(0),n+16477 ' 16477=16382+95
            Case -16382 To 16383 ' Normal
                y(3)=y(3)+&H00003FFF???+n
                Bit Set y(0),%FlagNor96
            Case >16383 ' Infinity
                Bit Set y(0),%FlagInf96
                For i=%FlagNor96 To %FlagNeg96-1: Bit Set y(0),i: Next i
            End Select
            Function=Convert96A(y())
        End Function
        A much larger function pair for integer powers of ten is provided below. The array elements are the most accurate 96-bit significand values possible.

        Code:
        Function PowerOfTen96T(y As Type96, n As Long) As Ext
            ' y=10^n Tabulated integer power of ten
            Dim y96(3) As Dword At VarPtr(y)
            Function=PowerOfTen96A(y96(), n)
        End Function
         
        Function PowerOfTen96A(y() As Dword, _ ' Output array
            ByVal n As Long) As Ext            ' Input argument
            ' y <-- 10^n
            ' If function excluded, see #If metaststatement in Val96A().
            ' If table excluded and exponent too big, also see Val96A() on the
            '     use of 5 as a base for Power96A() and later debias result.
            Call CheckOut96A(y())
            Local i As Long
            i=CodePtr(End_Table)-CodePtr(PowerOfTen_Table)
            If (i Mod 16)<>0 Then ? "Error PowerOfTen table alignment":WaitKey$
            i=i\16
            Select Case i
            Case 4933+4961+1 ' Complete table. Check this case before next one.
                Dim f(3,-4961 To 4933) As Dword At CodePtr(PowerOfTen_Table)
                n=Max&(-4961,Min&(n,4933))
            Case >2*4932+1
                ? "Error PowerOfTen table":WaitKey$
            Case 0 ' No table option.
                ' Shorter but does introduce rounding errors.
                If Abs(n)>4932 Then ? "Error PowerOfTen exponent too big":WaitKey$
                Reset y(0)
                y(0)=10: Call Power96A(y(), y(),n)
                Exit Function
            Case Else ' Allow for a smaller symmetrical table, say 1E-100 to 1E+100.
                Decr i
                If Bit(i,0) Then ? "Error PowerOfTen table unsymmetrical":WaitKey$
                i=i\2
                Dim f(3,-i To i) As Dword At CodePtr(PowerOfTen_Table)
                If Abs(n)>i Then ? "Error Exceeds PowerOfTen table":WaitKey$
            End Select
            Dim d(3) As Dword At VarPtr(f(0,n))
            Call Copy96A(y(), d())
            Function=Convert96A(y())
            Exit Function
        #Align 16
        PowerOfTen_Table:
        ' Table must run from -4961 to +4933 or from -m to +m (m<4933) or be null.
        #Include "..\Data\Data96\PowerOfTen96.txt"
        End_Table:
        End Function
        The original Val96A() function optional metastatement modification to use this power of ten function is below (but the false option can optionally be excluded with a null table unless exponent may be large):
        Code:
        ...
        IncludePowerSign:
            #If -1 ' Use True (-1) if PowerOfTen96A() exists, else use 0.
                ' More accurate, but PowerOfTen96A() is almost 600KB.
                Call PowerOfTen96A(p(),e)
                Call Multiply96A(y(), y(),p())
            #Else
                ' Less accurate but shorter.
                ' Using 5 instead of 10 avoids denormals in Power96A().
                p(0)=5: Call Power96A(p(), p(),e)
                Call Multiply96A(y(), y(),p())
                b(0)=b(0)+e
            #EndIf
        ...
        The next statement is: Select Case b(0).

        The PowerOfTen96.txt file at the path ..\Data\Data96\ has to be done as an attachment because of its size. The zipped .txt file is at the bottom of this post. A few values near 1E0 are below.
        Code:
        !dd &H59787E2C, &H70297EBD,&HDFF97724, &H80003EB2 ' 1E-100
        !dd &H57EB4EDB, &HC619EF36,&H8BFBEA76, &H80003EB6 ' 1E-99
        !dd &HEDE62292, &H77A06B03,&HAEFAE514, &H80003EB9 ' 1E-98
        !dd &HE95FAB37, &H958885C4,&HDAB99E59, &H80003EBC ' 1E-97
        !dd &H11DBCB02, &HFD75539B,&H88B402F7, &H80003EC0 ' 1E-96
        !dd &HD652BDC3, &HFCD2A881,&HAAE103B5, &H80003EC3 ' 1E-95
        !dd &H4BE76D33, &H7C0752A2,&HD59944A3, &H80003EC6 ' 1E-94
        !dd &H6F70A440, &H2D8493A5,&H857FCAE6, &H80003ECA ' 1E-93
        !dd &HCB4CCD50, &HB8E5B88E,&HA6DFBD9F, &H80003ECD ' 1E-92
        !dd &H7E2000A4, &HA71F26B2,&HD097AD07, &H80003ED0 ' 1E-91
        !dd &H8ED40067, &HC873782F,&H825ECC24, &H80003ED4 ' 1E-90
        !dd &H72890080, &HFA90563B,&HA2F67F2D, &H80003ED7 ' 1E-89
        !dd &H4F2B40A0, &H79346BCA,&HCBB41EF9, &H80003EDA ' 1E-88
        !dd &HE2F610C8, &HD78186BC,&HFEA126B7, &H80003EDD ' 1E-87
        !dd &H0DD9CA7D, &HE6B0F436,&H9F24B832, &H80003EE1 ' 1E-86
        !dd &H91503D1C, &HA05D3143,&HC6EDE63F, &H80003EE4 ' 1E-85
        !dd &H75A44C64, &H88747D94,&HF8A95FCF, &H80003EE7 ' 1E-84
        !dd &HC986AFBE, &HB548CE7C,&H9B69DBE1, &H80003EEB ' 1E-83
        !dd &HFBE85BAE, &H229B021B,&HC24452DA, &H80003EEE ' 1E-82
        !dd &HFAE27299, &HAB41C2A2,&HF2D56790, &H80003EF1 ' 1E-81
        !dd &HDCCD87A0, &H6B0919A5,&H97C560BA, &H80003EF5 ' 1E-80
        !dd &H5400E988, &H05CB600F,&HBDB6B8E9, &H80003EF8 ' 1E-79
        !dd &H290123EA, &H473E3813,&HED246723, &H80003EFB ' 1E-78
        !dd &HF9A0B672, &H0C86E30B,&H9436C076, &H80003EFF ' 1E-77
        !dd &HF808E40F, &H8FA89BCE,&HB9447093, &H80003F02 ' 1E-76
        !dd &HB60B1D12, &H7392C2C2,&HE7958CB8, &H80003F05 ' 1E-75
        !dd &HB1C6F22B, &H483BB9B9,&H90BD77F3, &H80003F09 ' 1E-74
        !dd &H1E38AEB6, &H1A4AA828,&HB4ECD5F0, &H80003F0C ' 1E-73
        !dd &H25C6DA64, &H20DD5232,&HE2280B6C, &H80003F0F ' 1E-72
        !dd &H579C487E, &H948A535F,&H8D590723, &H80003F13 ' 1E-71
        !dd &H2D835A9E, &H79ACE837,&HB0AF48EC, &H80003F16 ' 1E-70
        !dd &HF8E43145, &H98182244,&HDCDB1B27, &H80003F19 ' 1E-69
        !dd &H1B8E9ECB, &HBF0F156B,&H8A08F0F8, &H80003F1D ' 1E-68
        !dd &HE272467E, &HEED2DAC5,&HAC8B2D36, &H80003F20 ' 1E-67
        !dd &H5B0ED81E, &HAA879177,&HD7ADF884, &H80003F23 ' 1E-66
        !dd &H98E94713, &HEA94BAEA,&H86CCBB52, &H80003F27 ' 1E-65
        !dd &H3F2398D7, &HA539E9A5,&HA87FEA27, &H80003F2A ' 1E-64
        !dd &H8EEC7F0D, &H8E88640E,&HD29FE4B1, &H80003F2D ' 1E-63
        !dd &H1953CF68, &HF9153E89,&H83A3EEEE, &H80003F31 ' 1E-62
        !dd &H5FA8C342, &HB75A8E2B,&HA48CEAAA, &H80003F34 ' 1E-61
        !dd &H3792F413, &H653131B6,&HCDB02555, &H80003F37 ' 1E-60
        !dd &HE2BBD88C, &H5F3EBF11,&H808E1755, &H80003F3B ' 1E-59
        !dd &H5B6ACEAF, &HB70E6ED6,&HA0B19D2A, &H80003F3E ' 1E-58
        !dd &HF245825A, &H64D20A8B,&HC8DE0475, &H80003F41 ' 1E-57
        !dd &HEED6E2F1, &HBE068D2E,&HFB158592, &H80003F44 ' 1E-56
        !dd &H55464DD7, &HB6C4183D,&H9CED737B, &H80003F48 ' 1E-55
        !dd &HAA97E14C, &HA4751E4C,&HC428D05A, &H80003F4B ' 1E-54
        !dd &HD53DD99F, &H4D9265DF,&HF5330471, &H80003F4E ' 1E-53
        !dd &HE546A804, &HD07B7FAB,&H993FE2C6, &H80003F52 ' 1E-52
        !dd &HDE985204, &H849A5F96,&HBF8FDB78, &H80003F55 ' 1E-51
        !dd &H963E6686, &HA5C0F77C,&HEF73D256, &H80003F58 ' 1E-50
        !dd &HDDE70013, &H27989AAD,&H95A86376, &H80003F5C ' 1E-49
        !dd &H5560C018, &HB17EC159,&HBB127C53, &H80003F5F ' 1E-48
        !dd &HAAB8F01E, &H9DDE71AF,&HE9D71B68, &H80003F62 ' 1E-47
        !dd &HCAB39613, &H62AB070D,&H92267121, &H80003F66 ' 1E-46
        !dd &H3D607B98, &HBB55C8D1,&HB6B00D69, &H80003F69 ' 1E-45
        !dd &H8CB89A7E, &H2A2B3B05,&HE45C10C4, &H80003F6C ' 1E-44
        !dd &H77F3608F, &H9A5B04E3,&H8EB98A7A, &H80003F70 ' 1E-43
        !dd &H55F038B2, &H40F1C61C,&HB267ED19, &H80003F73 ' 1E-42
        !dd &H6B6C46DF, &H912E37A3,&HDF01E85F, &H80003F76 ' 1E-41
        !dd &H2323AC4B, &HBABCE2C6,&H8B61313B, &H80003F7A ' 1E-40
        !dd &HABEC975E, &HA96C1B77,&HAE397D8A, &H80003F7D ' 1E-39
        !dd &H96E7BD36, &H53C72255,&HD9C7DCED, &H80003F80 ' 1E-38
        !dd &H7E50D641, &H545C7575,&H881CEA14, &H80003F84 ' 1E-37
        ' Limit of single-precision normals
        !dd &HDDE50BD2, &H697392D2,&HAA242499, &H80003F87 ' 1E-36
        !dd &H955E4EC6, &HC3D07787,&HD4AD2DBF, &H80003F8A ' 1E-35
        !dd &HBD5AF13C, &HDA624AB4,&H84EC3C97, &H80003F8E ' 1E-34
        !dd &HECB1AD8B, &HD0FADD61,&HA6274BBD, &H80003F91 ' 1E-33
        !dd &H67DE18EE, &H453994BA,&HCFB11EAD, &H80003F94 ' 1E-32
        !dd &H80EACF95, &H4B43FCF4,&H81CEB32C, &H80003F98 ' 1E-31
        !dd &HA125837A, &H5E14FC31,&HA2425FF7, &H80003F9B ' 1E-30
        !dd &H096EE458, &H359A3B3E,&HCAD2F7F5, &H80003F9E ' 1E-29
        !dd &H8BCA9D6E, &H8300CA0D,&HFD87B5F2, &H80003FA1 ' 1E-28
        !dd &H775EA265, &H91E07E48,&H9E74D1B7, &H80003FA5 ' 1E-27
        !dd &H95364AFE, &H76589DDA,&HC6120625, &H80003FA8 ' 1E-26
        !dd &H3A83DDBE, &HD3EEC551,&HF79687AE, &H80003FAB ' 1E-25
        !dd &HC4926A96, &H44753B52,&H9ABE14CD, &H80003FAF ' 1E-24
        !dd &H75B7053C, &H95928A27,&HC16D9A00, &H80003FB2 ' 1E-23
        !dd &H5324C68B, &HBAF72CB1,&HF1C90080, &H80003FB5 ' 1E-22
        !dd &HD3F6FC17, &H74DA7BEE,&H971DA050, &H80003FB9 ' 1E-21
        !dd &H88F4BB1D, &H92111AEA,&HBCE50864, &H80003FBC ' 1E-20
        !dd &H2B31E9E4, &HB69561A5,&HEC1E4A7D, &H80003FBF ' 1E-19
        !dd &H3AFF322E, &H921D5D07,&H9392EE8E, &H80003FC3 ' 1E-18
        !dd &H09BEFEBA, &H36A4B449,&HB877AA32, &H80003FC6 ' 1E-17
        !dd &H4C2EBE68, &HC44DE15B,&HE69594BE, &H80003FC9 ' 1E-16
        !dd &H0F9D3701, &H3AB0ACD9,&H901D7CF7, &H80003FCD ' 1E-15
        !dd &H538484C2, &H095CD80F,&HB424DC35, &H80003FD0 ' 1E-14
        !dd &H2865A5F2, &H4BB40E13,&HE12E1342, &H80003FD3 ' 1E-13
        !dd &HF93F87B7, &H6F5088CB,&H8CBCCC09, &H80003FD7 ' 1E-12
        !dd &HF78F69A5, &HCB24AAFE,&HAFEBFF0B, &H80003FDA ' 1E-11
        !dd &HB573440E, &HBDEDD5BE,&HDBE6FECE, &H80003FDD ' 1E-10
        !dd &H31680A89, &H36B4A597,&H89705F41, &H80003FE1 ' 1E-9
        !dd &HFDC20D2B, &H8461CEFC,&HABCC7711, &H80003FE4 ' 1E-8
        !dd &H3D329076, &HE57A42BC,&HD6BF94D5, &H80003FE7 ' 1E-7
        !dd &HA63F9A4A, &HAF6C69B5,&H8637BD05, &H80003FEB ' 1E-6
        !dd &H0FCF80DC, &H1B478423,&HA7C5AC47, &H80003FEE ' 1E-5
        !dd &HD3C36113, &HE219652B,&HD1B71758, &H80003FF1 ' 1E-4
        !dd &H645A1CAC, &H8D4FDF3B,&H83126E97, &H80003FF5 ' 1E-3
        !dd &H3D70A3D7, &H70A3D70A,&HA3D70A3D, &H80003FF8 ' 1E-2
        !dd &HCCCCCCCD, &HCCCCCCCC,&HCCCCCCCC, &H80003FFB ' 1E-1
        !dd &H00000000, &H00000000,&H80000000, &H80003FFF ' 1E0
        !dd &H00000000, &H00000000,&HA0000000, &H80004002 ' 1E+1
        !dd &H00000000, &H00000000,&HC8000000, &H80004005 ' 1E+2
        !dd &H00000000, &H00000000,&HFA000000, &H80004008 ' 1E+3
        !dd &H00000000, &H00000000,&H9C400000, &H8000400C ' 1E+4
        !dd &H00000000, &H00000000,&HC3500000, &H8000400F ' 1E+5
        !dd &H00000000, &H00000000,&HF4240000, &H80004012 ' 1E+6
        !dd &H00000000, &H00000000,&H98968000, &H80004016 ' 1E+7
        !dd &H00000000, &H00000000,&HBEBC2000, &H80004019 ' 1E+8
        !dd &H00000000, &H00000000,&HEE6B2800, &H8000401C ' 1E+9
        !dd &H00000000, &H00000000,&H9502F900, &H80004020 ' 1E+10
        !dd &H00000000, &H00000000,&HBA43B740, &H80004023 ' 1E+11
        !dd &H00000000, &H00000000,&HE8D4A510, &H80004026 ' 1E+12
        !dd &H00000000, &H00000000,&H9184E72A, &H8000402A ' 1E+13
        !dd &H00000000, &H80000000,&HB5E620F4, &H8000402D ' 1E+14
        !dd &H00000000, &HA0000000,&HE35FA931, &H80004030 ' 1E+15
        !dd &H00000000, &H04000000,&H8E1BC9BF, &H80004034 ' 1E+16
        !dd &H00000000, &HC5000000,&HB1A2BC2E, &H80004037 ' 1E+17
        !dd &H00000000, &H76400000,&HDE0B6B3A, &H8000403A ' 1E+18
        !dd &H00000000, &H89E80000,&H8AC72304, &H8000403E ' 1E+19
        !dd &H00000000, &HAC620000,&HAD78EBC5, &H80004041 ' 1E+20
        !dd &H00000000, &H177A8000,&HD8D726B7, &H80004044 ' 1E+21
        !dd &H00000000, &H6EAC9000,&H87867832, &H80004048 ' 1E+22
        !dd &H00000000, &H0A57B400,&HA968163F, &H8000404B ' 1E+23
        !dd &H00000000, &HCCEDA100,&HD3C21BCE, &H8000404E ' 1E+24
        !dd &H00000000, &H401484A0,&H84595161, &H80004052 ' 1E+25
        !dd &H00000000, &H9019A5C8,&HA56FA5B9, &H80004055 ' 1E+26
        !dd &H00000000, &HF4200F3A,&HCECB8F27, &H80004058 ' 1E+27
        !dd &H40000000, &HF8940984,&H813F3978, &H8000405C ' 1E+28
        !dd &H50000000, &H36B90BE5,&HA18F07D7, &H8000405F ' 1E+29
        !dd &HA4000000, &H04674EDE,&HC9F2C9CD, &H80004062 ' 1E+30
        !dd &H4D000000, &H45812296,&HFC6F7C40, &H80004065 ' 1E+31
        !dd &HF0200000, &H2B70B59D,&H9DC5ADA8, &H80004069 ' 1E+32
        !dd &H6C280000, &H364CE305,&HC5371912, &H8000406C ' 1E+33
        !dd &HC7320000, &HC3E01BC6,&HF684DF56, &H8000406F ' 1E+34
        !dd &H3C7F4000, &H3A6C115C,&H9A130B96, &H80004073 ' 1E+35
        !dd &H4B9F1000, &HC90715B3,&HC097CE7B, &H80004076 ' 1E+36
        !dd &H1E86D400, &HBB48DB20,&HF0BDC21A, &H80004079 ' 1E+37
        !dd &H13144480, &HB50D88F4,&H96769950, &H8000407D ' 1E+38
        ' Limit of single-precision floating-point
        !dd &H17D955A0, &HE250EB31,&HBC143FA4, &H80004080 ' 1E+39
        !dd &H5DCFAB08, &H1AE525FD,&HEB194F8E, &H80004083 ' 1E+40
        !dd &H5AA1CAE5, &HD0CF37BE,&H92EFD1B8, &H80004087 ' 1E+41
        !dd &HF14A3D9E, &H050305AD,&HB7ABC627, &H8000408A ' 1E+42
        !dd &H6D9CCD06, &HC643C719,&HE596B7B0, &H8000408D ' 1E+43
        !dd &HE4820024, &H7BEA5C6F,&H8F7E32CE, &H80004091 ' 1E+44
        !dd &HDDA2802D, &H1AE4F38B,&HB35DBF82, &H80004094 ' 1E+45
        !dd &HD50B2038, &HA19E306E,&HE0352F62, &H80004097 ' 1E+46
        !dd &H4526F423, &HA502DE45,&H8C213D9D, &H8000409B ' 1E+47
        !dd &H9670B12B, &H0E4395D6,&HAF298D05, &H8000409E ' 1E+48
        !dd &H3C0CDD76, &H51D47B4C,&HDAF3F046, &H800040A1 ' 1E+49
        !dd &HA5880A6A, &HF324CD0F,&H88D8762B, &H800040A5 ' 1E+50
        !dd &H8EEA0D04, &HEFEE0053,&HAB0E93B6, &H800040A8 ' 1E+51
        !dd &H72A49046, &HABE98068,&HD5D238A4, &H800040AB ' 1E+52
        !dd &H47A6DA2B, &HEB71F041,&H85A36366, &H800040AF ' 1E+53
        !dd &H999090B6, &HA64E6C51,&HA70C3C40, &H800040B2 ' 1E+54
        !dd &HFFF4B4E4, &HCFE20765,&HD0CF4B50, &H800040B5 ' 1E+55
        !dd &HBFF8F10E, &H81ED449F,&H82818F12, &H800040B9 ' 1E+56
        !dd &HAFF72D52, &H226895C7,&HA321F2D7, &H800040BC ' 1E+57
        !dd &H9BF4F8A7, &HEB02BB39,&HCBEA6F8C, &H800040BF ' 1E+58
        !dd &H02F236D0, &H25C36A08,&HFEE50B70, &H800040C2 ' 1E+59
        !dd &H01D76242, &H179A2245,&H9F4F2726, &H800040C6 ' 1E+60
        !dd &H424D3AD3, &H9D80AAD6,&HC722F0EF, &H800040C9 ' 1E+61
        !dd &HD2E08987, &H84E0D58B,&HF8EBAD2B, &H800040CC ' 1E+62
        !dd &H63CC55F5, &H330C8577,&H9B934C3B, &H800040D0 ' 1E+63
        !dd &H3CBF6B72, &HFFCFA6D5,&HC2781F49, &H800040D3 ' 1E+64
        !dd &H8BEF464E, &H7FC3908A,&HF316271C, &H800040D6 ' 1E+65
        !dd &H97758BF1, &HCFDA3A56,&H97EDD871, &H800040DA ' 1E+66
        !dd &H3D52EEED, &H43D0C8EC,&HBDE94E8E, &H800040DD ' 1E+67
        !dd &H4CA7AAA8, &HD4C4FB27,&HED63A231, &H800040E0 ' 1E+68
        !dd &H8FE8CAA9, &H24FB1CF8,&H945E455F, &H800040E4 ' 1E+69
        !dd &HB3E2FD54, &HEE39E436,&HB975D6B6, &H800040E7 ' 1E+70
        !dd &H60DBBCA8, &HA9C85D44,&HE7D34C64, &H800040EA ' 1E+71
        !dd &HBC8955E9, &HEA1D3A4A,&H90E40FBE, &H800040EE ' 1E+72
        !dd &H6BABAB64, &HA4A488DD,&HB51D13AE, &H800040F1 ' 1E+73
        !dd &HC696963C, &H4DCDAB14,&HE264589A, &H800040F4 ' 1E+74
        !dd &HFC1E1DE6, &H70A08AEC,&H8D7EB760, &H800040F8 ' 1E+75
        !dd &H3B25A55F, &H8CC8ADA8,&HB0DE6538, &H800040FB ' 1E+76
        !dd &H49EF0EB7, &HAFFAD912,&HDD15FE86, &H800040FE ' 1E+77
        !dd &H6E356932, &H2DFCC7AB,&H8A2DBF14, &H80004102 ' 1E+78
        !dd &H49C2C37F, &H397BF996,&HACB92ED9, &H80004105 ' 1E+79
        !dd &HDC33745F, &H87DAF7FB,&HD7E77A8F, &H80004108 ' 1E+80
        !dd &H69A028BB, &HB4E8DAFD,&H86F0AC99, &H8000410C ' 1E+81
        !dd &HC40832EA, &H222311BC,&HA8ACD7C0, &H8000410F ' 1E+82
        !dd &HF50A3FA5, &H2AABD62B,&HD2D80DB0, &H80004112 ' 1E+83
        !dd &H792667C7, &H1AAB65DB,&H83C7088E, &H80004116 ' 1E+84
        !dd &H577001B9, &HA1563F52,&HA4B8CAB1, &H80004119 ' 1E+85
        !dd &HED4C0227, &H09ABCF26,&HCDE6FD5E, &H8000411C ' 1E+86
        !dd &H544F8158, &HC60B6178,&H80B05E5A, &H80004120 ' 1E+87
        !dd &H696361AE, &H778E39D6,&HA0DC75F1, &H80004123 ' 1E+88
        !dd &H03BC3A1A, &HD571C84C,&HC913936D, &H80004126 ' 1E+89
        !dd &H04AB48A0, &H4ACE3A5F,&HFB587849, &H80004129 ' 1E+90
        !dd &H62EB0D64, &HCEC0E47B,&H9D174B2D, &H8000412D ' 1E+91
        !dd &H3BA5D0BD, &H42711D9A,&HC45D1DF9, &H80004130 ' 1E+92
        !dd &HCA8F44EC, &H930D6500,&HF5746577, &H80004133 ' 1E+93
        !dd &H7E998B14, &HBBE85F20,&H9968BF6A, &H80004137 ' 1E+94
        !dd &H9E3FEDD9, &H6AE276E8,&HBFC2EF45, &H8000413A ' 1E+95
        !dd &HC5CFE94F, &HC59B14A2,&HEFB3AB16, &H8000413D ' 1E+96
        !dd &HBBA1F1D1, &H3B80ECE5,&H95D04AEE, &H80004141 ' 1E+97
        !dd &H2A8A6E46, &HCA61281F,&HBB445DA9, &H80004144 ' 1E+98
        !dd &HF52D09D7, &H3CF97226,&HEA157514, &H80004147 ' 1E+99
        !dd &H593C2626, &HA61BE758,&H924D692C, &H8000414B ' 1E+100
        If using these you must modify the code to:
        Code:
            Dim f(3,-100 To 100) As Dword At CodePtr(PowerOfTen_Table)
            n=Max&(-100,Min&(n,100))
        The zipped .txt file follows:
        Attached Files
        Last edited by Mark Longley-Cook; 12 Feb 2009, 12:22 PM. Reason: See first paragraph.

        Comment


        • #5
          String Arithmetic Functions

          Although not directly related to 96-bit significand operations, it is sometimes useful to do basic arithmetic operations using strings of indefinite precision. Of course any number can be expressed as the product of an integer and a power of ten. For example, the StringMultiply() function was used as the first step in generating the factorial table in an earlier post.

          These utility functions add (and with "-" appended, subtract), multiply, and divide strings taking them to be signed decimal integers of any length. Spaces, commas and plus signs are ignored as are balanced pairs of minus signs. The negative number -123 can be expressed by "-123", "---123", or even "1-2-3-". Note that rounding is never done; everything is truncated towards zero if precision is reduced. If StringDivide() has two arguments (the second being non-zero), integer division ("\") is done. Otherwise the third argument is used to determine how many significant unrounded digits to return but never less than the integer division result. Also, as a somewhat later addition, StringPrepare() was written with a third argument option to trim intermediate results to a reasonable length so (especially string multiplication) operations did not become too slow.

          The string results can be input as arguments to further calculations or to the Val96T() or Val96A() functions to return the best extended-precision result and either a Type96 UDT or double-word array, respectively. These functions utilize the LET tokens introduced in PBCC5. The StringPrepare(), StringAdd(), and StringMultiply() methodologies are very straightforward; the StringDivide(), only a little less so. Positive (non-zero) results have a space as the first character that can be removed with the LTrim$() function or else just modify the penultimate lines deleting $Spc+.

          An example of calculating 1000\(3*3-3) and pi trimmed to 4 significant digits:

          Code:
          Local n As Long
          Local a,b,c,d,e As String
          a="3"
          b=StringMultiply(a,a) ' =3*3
          c=StringAdd(b,"-"+a) ' =3*3-3
          d=StringDivide("1"+String$(3,"0"),c) ' =1000\(3*3-3)
          e=StringPrepare("3.14159",n,4) ' =3141; n=-3
          ? d;e;"E";Format$(n) ' should print "166 3141E-3"
          The functions follow:

          Code:
          Function StringPrepare(ByVal a As String, _ ' Input string
              ByRef n As Long, _                      ' Output (see below)
              Opt ByVal t As Long) As String          ' Optional trim size
              ' Result is tidied up integer form of a.
              ' With two arguments used to prepare strings for arithmetic:
              '     a = (Result)*(2*n+1) (Result=>0)
              '     Sign (n) is true (-1) if negative; false (0) otherwise.
              ' With three arguments used to trim (no rounding) excess digits:
              '     a = (Result)*(10^n)
              '     If necessary, decimal point removed.
              '     Then string trimmed to t (>0) digits and sign reapplied.
              Local m As Long
              Local s As String
              If t<0 Then ? "Trim size <0":WaitKey$
              m=IsTrue(Tally(a,"-") And 1)
              a=LTrim$(Remove$(a, Any "+- ,"),"0")
              s=Remove$(a, Any "0123456789")
              Select Case s
              Case ""
                  ' Integer
                  If t=0 Then n=m: Function=a: Exit Function
                  n=0
              Case "."
                  ' Decimal value so adjust n
                  If t=0 Then ? "Error Decimal point illegal here":WaitKey$
                  n=InStr(a,".")-Len(a)
                  a=Remove$(a,".")
              Case Else: ? "Error Character(s) ";s:WaitKey$
              End Select
              n+=Max&(Len(a)-t,0)
              a=Left$(a,t)
              If m Then Function="-"+a Else Function=$Spc+a
          End Function
           
          Function StringAdd(ByVal a As String, ByVal b As String) As String
              ' Result <-- a+b where a and b are signed integer strings
              ' To subtract call using something like "-"+a
              Local n As Long:n=Asc("9")
              Local z As Long:z=Asc("0")
              Local sa,sb As Long
              Local i,j,ka,kb As Long
              a=StringPrepare(a, sa)
              b=StringPrepare(b, sb)
              If a="" And b="" Then Function="0": Exit Function
              If a="" Then
                  If sb Then Function="-"+b Else Function=b
                  Exit Function
              End If
              If b="" Then
                  If sa Then Function="-"+a Else Function=a
                  Exit Function
              End If
              kb=Len(a)-Len(b)
              Select Case kb
              Case <0: Swap a,b: Swap sa,sb: kb=-kb
              Case 0: If a=b And (sa Xor sb) Then Function="0": Exit Function
              End Select
              ka=Len(a)+1: kb=kb+2
              a="0"+a: b=String$(kb-1,"0")+b
              ' ka=length of a; kb=position of 1st non-zero in b (kb=>2).
              If sa Xor sb Then
                  ' Subtract
                  For i=ka To kb Step -1
                      Asc(a,i)=Asc(a,i)-Asc(b,i)+z
                      If Asc(a,i)<z Then
                          For j=i To 2 Step -1
                              Asc(a,j)=Asc(a,j)+10
                              Asc(a,j-1)=Asc(a,j-1)-1
                              If Asc(a,j-1)=>z Then Exit For
                          Next j
                      End If
                  Next i
              Else
                  ' Add
                  For i=ka To kb Step -1
                      Asc(a,i)=Asc(a,i)+Asc(b,i)-z
                      If Asc(a,i)>n Then
                          For j=i To 2 Step -1
                              Asc(a,j)=Asc(a,j)-10
                              Asc(a,j-1)=Asc(a,j-1)+1
                              If Asc(a,j-1)<=n Then Exit For
                          Next j
                      End If
                  Next i
              End If
              a=LTrim$(a,"0")
              If sa Then Function="-"+a Else Function=$Spc+a
          End Function
           
          Function StringMultiply(ByVal a As String, ByVal b As String) As String
              ' Result <-- a*b where a and b are signed integer strings
              Local z As Long:z=Asc("0")
              Local sa,sb As Long
              Local i,j,k,ka,kb As Long
              Local f,t As String
              a=StringPrepare(a, sa)
              b=StringPrepare(b, sb)
              ka=Len(a): kb=Len(b)
              If ka<kb Then Swap a,b: Swap ka,kb ' Little faster if b<a
              Dim p(ka+kb) As Local Long
              Dim aa(ka) As Long:Dim bb(kb) As Long
              For i=1 To ka
                  aa(i)=Asc(a,i)-z
                  If i<=kb Then bb(i)=Asc(b,i)-z
              Next i
              For i=1 To kb
                  k=bb(i)
                  If k Then
                      For j=1 To ka
                          p(i+j)+=aa(j)*k
                      Next j
                  End If
              Next i
              For i=ka+kb To 2 Step -1
                  p(i-1)+=p(i)\10
                  p(i) Mod= 10
              Next i
              For i=1 To ka+kb
                  f+=Chr$(p(i)+z)
              Next i
              f=LTrim$(f,"0")
              If sa Xor sb Then Function="-"+f Else Function=$Spc+f
          End Function
           
          Function StringDivide(ByVal a As String, ByVal b As String, _
              Opt ByVal c As Long) As String ' c=cutoff (see below)
              ' Result <-- a/b where a and b are signed integer strings
              ' No rounding is done; truncated towards zero.
              ' c is the minimum string length once decimal location determined.
              ' Set c=0 to do integer division (i.e., Result <-- a\b).
              Local d As Long:d=Asc(".")
              Local n As Long:n=Asc("9")
              Local z As Long:z=Asc("0")
              Local sa,sb As Long
              Local i,j,k As Long
              Local f,t As String
              a=StringPrepare(a, sa)
              b=StringPrepare(b, sb)
              If a="" Then Function="0": Exit Function
              If b="" Then ? "Error null or zero denominator":WaitKey$
              k=Len(a)-Len(b)
              Select Case k
              Case <0: a=String$(-k,"0")+a: k=0
              Case >0: b+=String$(k,"0")
              End Select
              Do
                  If Len(f)=k+1 Then
                      f=LTrim$(f,"0")+"."
                      If Asc(f)=d Then f="0"+f
                  End If
                  If Len(f)>c And InStr(f,".")>0 Then Exit Do
                  f=f+"0"
                  If Len(a)<>Len(b) Then ? "Error length": WaitKey$
                  Do While b<=a ' Test works only if they are equal length
                      ' This i-loop subtracts b from a (equal length)
                      ' Could have used StringAdd() but this was coded first.
                      For i=Len(a) To 1 Step -1
                          j=Asc(a,i)-Asc(b,i)
                          If j=>0 Then
                              Asc(a,i)=j+z
                          Else
                              Asc(a,i)=j+z+10
                              j=i-1
                              Do
                                  If Asc(a,j)>z Then
                                      Asc(a,j)=Asc(a,j)-1
                                      Exit Do
                                  Else
                                      Asc(a,j)=n
                                      Decr j
                                  End If
                              Loop
                          End If
                      Next i
                      Asc(f,-1)=Asc(f,-1)+1
                  Loop
                  ' These retain equality of length
                  Do While Asc(a)=z And Asc(b)=z
                      a=Mid$(a,2)
                      b=Mid$(b,2)
                  Loop
                  If Asc(a)=z Then
                      a=Mid$(a,2)+"0"
                  Else
                      a+="0"
                      b="0"+b
                  End If
              Loop
              If Asc(f)=d Then f="0"+f
              If c=0 Then
                  If Asc(f,-1)<>d Then ? "Error decimal":WaitKey$
                  f=Remove$(f,".")
              End If
              If sa Xor sb Then Function="-"+f Else Function=$Spc+f
          End Function

          Comment


          • #6
            Type96 correction

            The editing window for the first post on this thread is closed. There is a critical error in the Type block for Type69 that escaped my checks. Change the first line in the block from:
            Type Type96 Dword
            to:
            Type Type96 Word
            As you might guess, I work almost exclusively with the ...96A() style that does not require use of the UDT.

            There is also a minor error in Str96A(). Change:
            If e(1)=>e(0) Then ? "Error exponent":WaitKey$
            to:
            If e(1)=>e(0) And Val(s(1))<>0 Then ? "Error exponent":WaitKey$
            because the former can indicate an error when no adjustment is required.

            ________________
            Mark Longley-Cook

            Comment


            • #7
              96-Bit Significand -- Power table

              Minor edit 3/2/09 that removes restriction to one "#". One "#" was replaced with the line number, starting with zero; now "##" is replaced with twice that line number. I also toggle the flag bit for negation if nstr string begins with "-". Also removes use of i and j from EnhancedVal and resets v() so that GoSub can be used more than once. These changes are minimal and do not impact the original intended use but were inserted to allow expansion for other uses such as for larger Bernoulli and Euler numbers.

              I wrote this code for PowerArray96() in order to speed up the creation of a table in hex format of integer powers that could be incorporated into the code of other procedures during development. Because of problems getting a 96T version to work correctly with other procedures, there is no such version. Unlike other procedures in this thread, the DWord array is two-dimensional and the primary output is to the clipboard. Various statements require use of PBCC5+. If the resultant array is used elsewhere, the calling program should use something like the following:
              Dim y(3,0) As DWord ' DWord; two dimensions; first dimension is 0:3.
              Call PowerArray96("3.14159...", "pi^#", y())
              Dim a(3) As DWord At VarPtr(y(0,n)) ' or else use:
              Dim t(0) As Type96 At VarPtr(y(0,n)) ' where pi^n is of interest.
              Note that the procedure may be run without any other 96-bit significand procedures as the necessary equates are included and no sub/function calls are made.

              Code:
              ' These equates needed in case used alone.
              %FlagSig96=127
              %FlagInf96=120
              %FlagDen96=116
              %FlagZer96=112
              %FlagNeg96=111
              %FlagNor96=95
              Sub PowerArray96(ByVal s As String, _ ' Input decimal string (no "E")
                  Opt ByVal nstr As String, _       ' Optional name of s
                  y() As Dword)                     ' Optional output 2-dimensional array
                  ' Result <-- Array(s^j) in !dd &H..., &H...,&H..., &H... ' ...j... format
                  ' y(,j) <-- s^j
                  ' This is a fast stand alone utility connected with 96-bit
                  '     significand math.
                  ' Returns string of powers of s (to inf or zero) in clipboard.
                  ' String s may contain commas, blanks, sign, decimal but not E.
                  ' Ordinary rounding is done. This is unlikely to require manual
                  '     revisions unless s is an integer power of two.
                  ' Optional nstr must be blank or have one #. The # is replaced
                  '     by the exponent.
                  ' If last three characters in nstr are "^-#" then clipboard
                  '     output is in reverse order and zero power is omitted.
                  ' If used in the calling program, that program  must dimension
                  '     the third argument (i.e., y()) such as:
                  '     Dim y(3,0) As DWord
                  '     The first dimension must be 0:3.
                  '     The second dimension can be any size.
                  '     Second dimension size will be determined in this sub.
                  ' Let tokens, Build$() and Clipboard require PBCC5.
                  ' Examples of Call statements (two arguments) for pi^n and pi^-n are:
                  ' Call PowerArray96( _
                  '     "3.14159 26535 89793 23846 26433 83279 50288 41972","pi^#")
                  ' Call PowerArray96( _
                  '     "0.31830 98861 83790 67153 77675 26745 02872 40689","pi^-#")
                  '
                  Local e,i,ii,j,jj,k,ka,kb,last As Long
                  Local d0,d1 As Dword
                  Local vals As Ext ' Val(s)
                  Local m As Long: m=4 ' Minimum dimension for v()
                  ' Note: 9.63 decimal digits per DWord so m=4 good for 48.2 digits
                  Dim v(m) As Dword
                  Dim a(UBound(v())) As Dword
                  Dim b(UBound(v())) As Dword
                  Dim c(UBound(v())) As Dword
                  ' These have similar meanings to use in Val96A():
                  Local v() As Dword ' Enhancement of (v(0),v(1),v(2))
                  Local b0 As Long ' Binary unbiased exponent of v()
                  Local bn As Long ' Bit number bn < 32*(m+1)
                  Local dp As Long ' Decimal point is just before this character
                  ' These are used in clipboard section
                  Local clipt As String
                  Dim hexs(3) As String
                  ' Other dimensioning statements within program.
                  '
                  If ArrayAttr(y(),3)<>2 Then
                      ? "Error Must be 2-dimensional":WaitKey$
                  End If
                  If LBound(y(),1)<>0 Then
                      ? "Warning Lower bound should be zero":WaitKey$
                  End If
                  ' Standarize nstr:
                  nstr=Trim$(nstr)
                  If nstr="" Then nstr="#"
                  ' Work on s
                  s=Remove$(s, Any " ,+")
                  vals=Val(s)
                  s=Remove$(s, "-") ' Sign will be handled by vals
                  ' Do an enhanced Val96A() in a separate part of code
                  GoSub EnhancedVal
                  ' v() now contains the binary value of original s
                  ' b0 contains the unbiased binary exponent
                  If Bit(v(UBound(v())),31)=0 Then ? "Error Unnormalized":WaitKey$
                  ' Smallest 96-bit denormal = 2^-16477 ~ 0.85E-4960
                  ' with rounding, allow for 2^-16478
                  ' Maximum (inf) = 2^+16384 ~ 1.2E4932
                  ' As Log2(|vals|^n)=n*Log2(|vals|)
                  ' Log2(|vals|^(2^n)) = (2^n)*Log2(|vals|)
                  ' Log2(|Log2(|vals|^(2^n))|)= n+Log2(|Log2(|vals|)|)
                  ' n = Int((16478 or +16384) - Log2(|Log2(|vals|)|))
                  ' Add one or two to assure all powers included.
                  Select Case Abs(vals)
                  Case <1
                      j=Int(16478/Abs(Log2(Abs(vals)))+2)
                  Case  1: j=0: ? "Error Cannot do powers of 1.0":WaitKey$
                  Case >1
                      j=Int(16384/Abs(Log2(Abs(vals)))+2)
                  End Select
                  Dim ee(j) As Long
                  Dim dd(UBound(v()),UBound(ee())) As Dword
                  ' Exp2(n), 2^n and Log2(2^n) exact for integer n (-16382<=n<=16384)
                  i=Int(Log2(UBound(ee())))
                  If UBound(ee())=>Int(2^(i+1)) Then ? "Error Dimension":WaitKey$
                  Dim eee(i) As Long
                  Dim ddd(UBound(v()),UBound(eee())) As Dword
                  ? "Evaluating powers of ";RTrim$(RTrim$(nstr,"-"),"^");" ";
                  ? Str$(vals,18);" from 0 to";UBound(ee())
                  ' Set up ddd(i,0) = v(i) = |vals|^(2^0)
                  For i=0 To UBound(v())
                      a(i)=v(i): b(i)=v(i)
                      ddd(i,0)=v(i): eee(0)=b0
                  Next i
                  ' Repeatedly square as |vals|^(2^i) = [|vals|^(2^(i-1))]^2
                  For i=1 To UBound(ddd(),2)
                      e=0
                      GoSub Multiply ' c() <-- a() * b()
                      For j=0 To UBound(v())
                          a(j)=c(j): b(j)=c(j)
                          ddd(j,i)=c(j)
                      Next j
                      eee(i)=2*eee(i-1)+e
                  Next i
                  ' Now fill in powers not an integer power of two.
                  dd(UBound(v()),0)=&H80000000???: ee(0)=0
                  For i=1 To UBound(ee())
                      Reset a()
                      a(UBound(v()))=dd(UBound(v()),0): e=0 ' 1.0
                      ii=i:j=0
                      Do Until ii=0
                          If Bit(ii,0) Then
                              For k=0 To UBound(v()): b(k)=ddd(k,j): Next k
                              e+=eee(j)
                              GoSub Multiply ' c() <-- a() * b()
                              For k=0 To UBound(v()): a(k)=c(k): Next k
                          End If
                          Shift Right ii,1
                          Incr j
                      Loop
                      For k=0 To UBound(v()): dd(k,i)=c(k): Next k: ee(i)=e
                      If Bit(dd(UBound(dd(),1),i),31)=0 Then
                          ? "Error Unnormalized for";i:WaitKey$
                      End If
                  Next i
                  For i=0 To UBound(ee())
                      ee(i)+=&H00003FFF&
                  Next i
                  ' Assemble y(). Must ReDim to relocate
                  ReDim y(3,UBound(ee())) As Dword
                  For i=0 To UBound(y(),2)
                      Select Case ee(i)
                      Case <&H00000001&
                          y(3,i)=&H00000000???
                          Bit Set y(0,i), %FlagDen96
                          For j=ee(i) To 0
                              For k=0 To UBound(dd(),1)-1
                                  Shift Right dd(k,i),1
                                  If Bit(dd(k+1,i),0) Then Bit Set dd(k,i),31
                              Next k
                              Shift Right dd(UBound(dd(),1),i),1
                          Next j
                          y(2,i)=dd(UBound(dd(),1)-0,i)
                          y(1,i)=dd(UBound(dd(),1)-1,i)
                          y(0,i)=dd(UBound(dd(),1)-2,i)
                          If Bit(dd(UBound(dd(),1)-3,i),31) Then
                              Incr y(0,i)
                              If y(0,i)=0 Then
                                  Incr y(1,i)
                                  If y(1,i)=0 Then
                                      Incr y(2,i)
                                      If y(2,i)=&H80000000??? Then
                                          Incr y(3,i)
                                          Bit Reset y(0,i), %FlagDen96
                                      End If
                                  End If
                              End If
                          End If
                          If (y(0,i) Or y(1,i) Or y(2,i))=0 Then
                              y(3,i)=0
                              Bit Set y(0,i), %FlagSig96
                              Bit Set y(0,i), %FlagZer96
                              last=i
                              Exit For ' Done
                          End If
                      Case >&H00007FFE&
                          y(0,i)=0: y(1,i)=0: y(2,i)=0: y(3,i)=0
                          Bit Set y(0,i), %FlagSig96
                          Bit Set y(0,i), %FlagInf96
                          For j=%FlagNor96 To %FlagNeg96-1:Bit Set y(0,i),j:Next j
                          last=i
                          Exit For ' Done
                      Case Else
                          If i=UBound(y(),2) Then
                              ? "Error Enlarge dd dimension calc":WaitKey$
                          End If
                          y(3,i)=Mak(Dword,ee(i),0)
                          y(2,i)=dd(UBound(dd(),1)-0,i)
                          y(1,i)=dd(UBound(dd(),1)-1,i)
                          y(0,i)=dd(UBound(dd(),1)-2,i)
                          If Bit(dd(UBound(dd(),1)-3,i),31) Then
                              Incr y(0,i)
                              If y(0,i)=0 Then
                                  Incr y(1,i)
                                  If y(1,i)=0 Then
                                      Incr y(2,i)
                                      If y(2,i)=0 Then
                                          Bit Set y(0,i), %FlagNor96
                                          Incr y(3,i)
                                          If y(3,i)=&H00007FFF??? Then
                                              ' y(0,i), y(1,i) & y(2,i) are OK
                                              Bit Set y(0,i), %FlagSig96
                                              Bit Set y(0,i), %FlagInf96
                                              last=i
                                              Exit For ' Done
                                          End If
                                      End If
                                  End If
                              End If
                          End If
                      End Select
                      Bit Set y(0,i), %FlagSig96
                      If Bit(y(0,i),%FlagDen96) Then
                          j=(y(0,i) Or y(1,i) Or y(2,i))
                          If j=0 Then
                              y(3,i)=0
                              Bit Set y(0,i), %FlagSig96
                              Bit Set y(0,i), %FlagZer96
                              last=i
                              Exit For ' Done
                          End If
                      End If
                      If vals<0 And Bit(i,0)=1 Then Bit Set y(0,i),%FlagNeg96
                      If Left$(nstr,1)="-" Then
                          Bit Toggle y(0,i),%FlagNeg96
                      End If
                  Next i
                  If last>0 And vals<0 And Bit(last,0)=1 Then
                      Bit Set y(0,last),%FlagNeg96 ' In case of early Exit For
                  End If
                  If last=0 Then
                      last=UBound(ee())
                      ? "Warning Did not finish. Press a key.":WaitKey$
                  End If
                  ' Put on clipboard
                  Select Case Abs(vals)
                  Case <1
                      Dim clip(last) As String ' One extra for final $CrLf
                      For i=last To 1 Step -1
                          For j=0 To 3
                              hexs(j)=Hex$(y(j,i),8)
                          Next j
                          clipt=" ' "+nstr
                          Replace "##" With Format$(2*i) In clipt
                          Replace "#" With Format$(i) In clipt
                          If Bit(y(0,i),%FlagZer96) Then clipt=" ' Zero"
                          clip(last-i)= _                     ' Work backwards
                              Build$("!dd &H",hexs(0), _      ' Significand extension
                              ", &H",hexs(1),",&H",hexs(2), _ ' 64-bit significand
                              ", &H",hexs(3),clipt)           ' Flags/sgn/exp/comment
                      Next i
                      ' Note: clip(last)=""
                  Case >1
                      Dim clip(last+1) As String ' One extra for final $CrLf
                      For i=0 To last
                          For j=0 To 3
                              hexs(j)=Hex$(y(j,i),8)
                          Next j
                          clipt=" ' "+nstr
                          Replace "##" With Format$(2*i) In clipt
                          Replace "#" With Format$(i) In clipt
                          If Bit(y(0,i),%FlagInf96) Then clipt=" ' Infinity"
                          clip(i)= _                          ' Work forwards
                              Build$("!dd &H",hexs(0), _      ' Significand extension
                              ", &H",hexs(1),",&H",hexs(2), _ ' 64-bit signif.
                              ", &H",hexs(3),clipt)           ' Flags/sgn/exp/comment
                      Next i
                      ' Note: clip(last+1)=""
                  End Select
                  clipt=Join$(clip(), $CrLf)
                  j=Len(clipt)
                  Clipboard Reset, i: If i Then Clipboard Set Text clipt
                  clipt="": If i Then Clipboard Get Text clipt
                  If i=0 Or Len(clipt)<>j Then ? "Error Clipboard failed":WaitKey$
                  Exit Sub
              '------------------------------------------------
              ' All GoSub routines to get binary strings:
              EnhancedVal:
                  Reset v()
                  If InStr(s, Any "EeDd") Then ? "Error EeDd not allowed":WaitKey$
                  ' "-" has been deleted
                  If InStr(s,".")=0 Then s=s+"."
                  If Tally(s,".")<>1 Then ? "Error multiple decimals":WaitKey$
                  s=Trim$(s,"0")
                  If Remove$(s, Any "01234456789.")<>"" Then
                      ? "Error character(s) ";Remove$(s,Any"01234456789."):WaitKey$
                  End If
                  If s="." Then ? "Error Cannot do powers of zero":WaitKey$
                  ' Initial values:
                  Reset b0: bn=32*m+31: dp=InStr(s,".")
                  s=Remove$(s,".")
                  If dp<>1 Then
                      ' Halve until <2.0
                      Do Until dp=2 And Asc(s)=Asc("1")
                          Reset jj
                          For ii=1 To Len(s)
                              jj=Asc(s,ii)-Asc("0")+10*jj
                              Mid$(s,ii,1)=Chr$(jj\2+Asc("0"))
                              jj=Bit(jj,0)
                          Next ii
                          Incr b0
                          If jj Then s+="5"
                          jj=Len(s): s=LTrim$(s,"0"): dp-=(jj-Len(s))
                          s=RTrim$(s,"0")
                          If Len(s)<dp Then s+=String$(dp-Len(s),"0")
                      Loop
                  Else
                      ' Double until =>1.0
                      Do Until dp=2 And Asc(s)=Asc("1")
                          Decr b0
                          GoSub DoubleString
                      Loop
                  End If
                  ' Now dp=2 and Asc(s)=Asc("1") so create binary string
                  Do Until bn<0 ' Skip the rounding routines
                      If dp=2 And Asc(s)=Asc("1") Then ' bn=>0 already
                          Bit Set v(0),bn
                          Mid$(s,1,1)="0"
                      End If
                      If Trim$(s,"0")="" Then Exit Do
                      Decr bn
                      GoSub DoubleString
                  Loop
              '------------------------------------------------
              ' GoSub routinine to evaluate string (IncludePowerSign never needed)
              DoubleString:
                  ' GoSub routine called to double string
                  Reset jj
                  For ii=Len(s) To 1 Step -1
                      jj=2*(Asc(s,ii)-Asc("0"))+jj
                      Mid$(s,ii,1)=Chr$((jj Mod 10)+Asc("0"))
                      jj\=10
                  Next ii
                  If jj Then
                      s="1"+s
                      Incr dp
                  End If
                  s=RTrim$(s,"0")
                  If Len(s)<dp Then s=s+String$(dp-Len(s),"0")
                  Return
              '------------------------------------------------
              ' All GoSub routines to multiply binary strings as DWords:
              ' Most suignificant bits is set; Multiply a() * b()
              Multiply:
                  ReDim q(UBound(a)+UBound(b)+1) As Quad
                  For ka=0 To UBound(a): For kb=0 To UBound(b)
                      d0=a(ka):d1=b(kb)
                      ' Do this in assembler since no QWord datatype in PB.
                      !mov eax,d0
                      !mov edx,d1
                      !mul edx ' Unsigned multiply edx:eax <-- eax * edx
                      !mov d0,edx
                      !mov d1,eax
                      k=ka+kb
                      q(k)+=d1
                      Incr k
                      q(k)+=d0
                  Next kb: Next ka
                  For k=0 To UBound(q)-1
                      q(k+1)+=Hi(Dword,q(k))
                      q(k)=Lo(Dword,q(k))
                  Next k
                  If Bit(q(UBound(q)),31) Then
                      Incr e
                  Else
                      For k=UBound(q) To 0 Step -1
                          Shift Left q(k),1
                          If k>0 Then
                              q(k)+=Bit(q(k-1),31)
                              Bit Reset q(k-1),31
                          End If
                      Next k
                      If Bit(q(UBound(q)),31)=0 Then ? "Error Shift":WaitKey$
                  End If
                  For k=0 To UBound(c): c(k)=q(UBound(q)-UBound(c)+k): Next k
                  Return
              End Sub
              ________________
              Mark Longley-Cook
              Last edited by Mark Longley-Cook; 2 Mar 2009, 11:50 AM. Reason: See first paragraph.

              Comment


              • #8
                96-Bit Significand -- Bernoulli, Euler, zeta, beta.

                Edit of 3/4/09 clarified and added a paragraph. Edit of 3/9/09 added a code to convert to extended-precision, a table of zeta(n)-1 and list of sources. Edit of 3/11/09 revised source for the beta function of even arguments.

                Here are the smaller Bernoulli numbers, Euler numbers, Riemann zeta function and Dirichlet beta function. The latter two are for smaller non-negative integers. All are in the 96-bit significand format. Larger Bernoulli and Euler numbers can be calculated by their asymptotic formulae or from Simon Plouffe's on-line values to B1000 and E1000. Simon also has a handy file of zeta() for odd arguments to 99. These on-line data were used to check the values below. The values for zeta and beta functions for larger arguments than given are 1.0 to 96-bit significand accuracy.

                The largest finite values that can be expressed with a 96-bit significand are B2312 and E1866. In general, to convert a line such as
                !dd &Hab, &Hcd,&Hef, &Hgh ' comment
                to extended-precision, rearrange the 2-byte (4-nibble) words (a, b, c, d, e, f, g, and h) to:
                !dw &Hd,&Hc,&Hf,&He, &Hh ' comment
                incrementing d if the most significant bit of a is set. (Although not the case here, rounding could extend to c, f, e, and h, respectively.) Delete values beginning with zeta(65) and beta(42) as they round to 1.0##. Also delete beginning with zeta(110)-1 as they are equal to 2^-n in extended-precision. Here is a simple code to convert to extended-precision format:

                Code:
                ' Metastatements omitted.
                Function PBMain() As Long
                    ' Convert 96-bit significand to extended-precision tables.
                    Local s, t, u As String
                    Open "..." For Input As #1 ' 96-bit significand table
                    Open "..." For Output As #2 ' Extended-precision table
                    Do Until Eof(1)
                        Line Input #1, s
                        t=s ' Working copy
                        u=Remain$(t,"'") ' Comment
                        t=Remove$(Extract$(t,"'"), Any $Tab+$Spc) ' Standardize
                        If u<>"" Then u="'"+u
                        If Instr("89ABCDEFabcdef",Mid$(t,6,1)) Then
                            ' Round up 64-bit significand
                            If Mid$(t,15,10)<>"&HFFFFFFFF" Then
                                Mid$(t,17,8)=Hex$(Val(Mid$(t,15,10))+1,8)
                            Else
                                ' So rare as to not warrant coding.
                                ? #2, "' Manually round up next line."
                                ? "Need to manually round up a line."
                            End If
                        End If
                        If Left$(t,5)="!dd&H" Then
                            s="!dw &H"+Mid$(t,21,4)+",&H"+Mid$(t,17,4)+ _
                                 ",&H"+Mid$(t,32,4)+",&H"+Mid$(t,28,4)+ _
                                ", &H"+Mid$(t,43,4)+$Spc+u
                        End If
                        Print #2, s
                    Loop
                    Close
                End Function
                The tables for inclusion within code follow:

                Code:
                ' Non-zero Bernoulli numbers. B0, B1, B2n (1<=n<=48)
                !dd &H00000000, &H00000000,&H80000000, &H80003FFF ' B0
                !dd &H00000000, &H00000000,&H80000000, &H8000BFFE ' B1
                !dd &HAAAAAAAB, &HAAAAAAAA,&HAAAAAAAA, &H80003FFC ' B2
                !dd &H88888889, &H88888888,&H88888888, &H8000BFFA ' B4
                !dd &H30C30C31, &H0C30C30C,&HC30C30C3, &H80003FF9 ' B6
                !dd &H88888889, &H88888888,&H88888888, &H8000BFFA ' B8
                !dd &HB26C9B27, &H6C9B26C9,&H9B26C9B2, &H80003FFB ' B10
                !dd &H1981981A, &H98198198,&H81981981, &H8000BFFD ' B12
                !dd &H55555555, &H55555555,&H95555555, &H80003FFF ' B14
                !dd &HF2F2F2F3, &HF2F2F2F2,&HE2F2F2F2, &H8000C001 ' B16
                !dd &H89F1E27C, &H9F1E27C7,&HDBE27C78, &H80004004 ' B18
                !dd &H967F3968, &H7F3967F3,&H8447F396, &H8000C008 ' B20
                !dd &HC4A33F13, &H33F128CF,&HC180FC4A, &H8000400B ' B22
                !dd &H60660660, &H06606606,&HA91A2066, &H8000C00F ' B24
                !dd &H55555555, &H55555555,&HAE036955, &H80004013 ' B26
                !dd &HE329C8AE, &HAE329C8A,&HD044DB88, &H8000C017 ' B28
                !dd &H6907F8DA, &H9A41FE36,&H8F6D9527, &H8000401C ' B30
                !dd &HE5E5E5E6, &HC5E5E5E5,&HE1402B1D, &H8000C020 ' B32
                !dd &H55555555, &HEA555555,&HC80E0E6E, &H80004025 ' B34
                !dd &HE644D531, &H8E055308,&HC787E567, &H8000C02A ' B36
                !dd &H55555555, &HCF4C9555,&HDE115D33, &H8000402F ' B38
                !dd &H1994C199, &H1CEAC84C,&H891C45FA, &H8000C035 ' B40
                !dd &H02449B5C, &H68B99B70,&HBAE4B5E0, &H8000403A ' B42
                !dd &H44EA7B2D, &H625960ED,&H8BF367A8, &H8000C040 ' B44
                !dd &HE04A7091, &HF92AD4E5,&HE5511ECC, &H80004045 ' B46
                !dd &H035A7ED9, &H1AF28EB9,&HCCC1630E, &H8000C04B ' B48
                !dd &H05C5026D, &H74B7C97F,&HC68BD9A2, &H80004051 ' B50
                !dd &H84CD3B87, &H269C50BF,&HD0662369, &H8000C057 ' B52
                !dd &H638E20F6, &H4EC6D9ED,&HEC0FCA9A, &H8000405D ' B54
                !dd &HE72968B5, &H899BE7CE,&H8FE1CBC7, &H8000C064 ' B56
                !dd &HCD277FFF, &H15A2506F,&HBC43D8D6, &H8000406A ' B58
                !dd &HE6C68242, &HE64065ED,&H83E32AAB, &H8000C071 ' B60
                !dd &HC7099D7F, &H1C11707C,&HC56ACE9D, &H80004077 ' B62
                !dd &H5A9A22DB, &H7AC81E1C,&H9D8521EF, &H8000C07E ' B64
                !dd &H1A3C74FC, &H8376E927,&H85BA73E5, &H80004085 ' B66
                !dd &H613E530B, &HE7B38500,&HF1239488, &H8000C08B ' B68
                !dd &HDA353B7E, &H385EB990,&HE67C7503, &H80004092 ' B70
                !dd &H23B236B9, &H1EBF0E52,&HE92A9A0F, &H8000C099 ' B72
                !dd &H235302C3, &H00217C1E,&HF9424E79, &H800040A0 ' B74
                !dd &HD8A8684B, &HF26E970C,&H8C94AF7E, &H8000C0A8 ' B76
                !dd &H15F38A89, &H524C2C49,&HA7162BE5, &H800040AF ' B78
                !dd &HDDCE7B1E, &HEA20C0A7,&HD0F8F1CB, &H8000C0B6 ' B80
                !dd &H40851D2F, &H4C4E8E7B,&H89565298, &H800040BE ' B82
                !dd &H2B907E92, &HB6DB7DC5,&HBD7C4610, &H8000C0C5 ' B84
                !dd &HAC53D8E5, &H59DB12CB,&H890DF874, &H800040CD ' B86
                !dd &H4C163E4A, &H25D44590,&HCFA5A47F, &H8000C0D4 ' B88
                !dd &H6AB34F48, &H4EF1A679,&HA492AF84, &H800040DC ' B90
                !dd &HC8B6BB63, &H3FBE5E80,&H885435D8, &H8000C0E4 ' B92
                !dd &H594B69E4, &HC1468A90,&HEBD8AAF0, &H800040EB ' B94
                !dd &H752E3111, &H4593C12C,&HD4D368CD, &H8000C0F3 ' B96
                ' To continue, use: B2n = -2 / (-(2*pi)^2)^n * (2*n)!
                Code:
                ' Non-zero Euler numbers. E2n (0<=n<=30)
                !dd &H00000000, &H00000000,&H80000000, &H80003FFF ' E0
                !dd &H00000000, &H00000000,&H80000000, &H8000BFFF ' E2
                !dd &H00000000, &H00000000,&HA0000000, &H80004001 ' E4
                !dd &H00000000, &H00000000,&HF4000000, &H8000C004 ' E6
                !dd &H00000000, &H00000000,&HAD200000, &H80004009 ' E8
                !dd &H00000000, &H00000000,&HC5590000, &H8000C00E ' E10
                !dd &H00000000, &H00000000,&HA4F6B400, &H80004014 ' E12
                !dd &H00000000, &H00000000,&HBE201D50, &H8000C01A ' E14
                !dd &H00000000, &H20000000,&H907A5FCA, &H80004021 ' E16
                !dd &H00000000, &H0C400000,&H8BFB7FEC, &H8000C028 ' E18
                !dd &H00000000, &H126A8000,&HA86CE18E, &H8000402F ' E20
                !dd &H00000000, &HC6B2ED00,&HF6606F0F, &H8000C036 ' E22
                !dd &H00000000, &H4A7B76B9,&HD74EB29F, &H8000403E ' E24
                !dd &H89000000, &HF6C10C74,&HDD8F8668, &H8000C046 ' E26
                !dd &H80BE8000, &HB6558E39,&H849690CA, &H8000404F ' E28
                !dd &HFEC3C280, &H2C50F716,&HB69E4735, &H8000C057 ' E30
                !dd &HC5049EA8, &H1C4AEC92,&H8F662657, &H80004060 ' E32
                !dd &HA9D1FDD2, &HFDD6C7FE,&HFEB7C306, &H8000C068 ' E34
                !dd &H1DBE9FEF, &H4AE24509,&HFE0CF194, &H80004071 ' E36
                !dd &H5450FF02, &H006982F1,&H8D5F6DE1, &H8000C07B ' E38
                !dd &H8F5C4091, &HC4371808,&HAE930E59, &H80004084 ' E40
                !dd &H53EC9F45, &HF3D1E39C,&HEDF5C700, &H8000C08D ' E42
                !dd &H701DD57F, &H78D37A76,&HB230DE64, &H80004097 ' E44
                !dd &H0FB8CA36, &HFCC300E7,&H91FCD71F, &H8000C0A1 ' E46
                !dd &HB51FB2D6, &H75275A37,&H8259F1E7, &H800040AB ' E48
                !dd &HCFC4EDAA, &H34118826,&HFCCC075D, &H8000C0B4 ' E50
                !dd &H94FC6CC4, &H0B6E01EF,&H84ABC0BF, &H800040BF ' E52
                !dd &H83384313, &H81920F07,&H964812C3, &H8000C0C9 ' E54
                !dd &H83170A24, &H08E6782F,&HB7323EE4, &H800040D3 ' E56
                !dd &H4AD41E4A, &H712E70BF,&HEFB4DBBA, &H8000C0DD ' E58
                !dd &H9CF2DD19, &HB758981A,&HA7EC9956, &H800040E8 ' E60
                ' To continue, use: E2n = (4/pi) * (-(2/pi)^2)^n * (2*n)!
                Code:
                ' Riemann zeta(n) function. 0<=n<=96, One
                !dd &H00000000, &H00000000,&H80000000, &H8000BFFE ' zeta(0)=-1/2
                !dd &H00000000, &H00000000,&H80000000, &H81007FFF ' zeta(1)=Infinity
                !dd &H73D89122, &H983E9918,&HD28D3312, &H80003FFF ' zeta(2)
                !dd &HB8B8AE2D, &H803109C1,&H99DD0027, &H80003FFF ' zeta(3)
                !dd &HF9121119, &H3EC241B5,&H8A899156, &H80003FFF ' zeta(4)
                !dd &H118271E9, &H53E66DBD,&H84BA0C76, &H80003FFF ' zeta(5)
                !dd &HED9785A8, &H0492247B,&H82384C26, &H80003FFF ' zeta(6)
                !dd &H4DFACD44, &HA679C46D,&H811196D0, &H80003FFF ' zeta(7)
                !dd &HF2CE526F, &HC31CB745,&H80859B57, &H80003FFF ' zeta(8)
                !dd &H7FD07DD9, &HC0B5AB81,&H8041CF9E, &H80003FFF ' zeta(9)
                !dd &HC08F982A, &HD2DDCBF0,&H80209719, &H80003FFF ' zeta(10)
                !dd &H4704E316, &HF2459954,&H8010318D, &H80003FFF ' zeta(11)
                !dd &HCDC84178, &HD9669820,&H80081052, &H80003FFF ' zeta(12)
                !dd &H83199648, &HE845DEF5,&H80040564, &H80003FFF ' zeta(13)
                !dd &HC3C30871, &H5E569C2A,&H800201C9, &H80003FFF ' zeta(14)
                !dd &HD0AAF45D, &HBCBF11BE,&H80010097, &H80003FFF ' zeta(15)
                !dd &H79D0156B, &H66F59178,&H80008032, &H80003FFF ' zeta(16)
                !dd &H034DE248, &HC1CDA19A,&H80004010, &H80003FFF ' zeta(17)
                !dd &H972535C4, &H932A6E89,&H80002005, &H80003FFF ' zeta(18)
                !dd &H49E441F2, &HDB08F9BA,&H80001001, &H80003FFF ' zeta(19)
                !dd &H74C43F0E, &H9E2CA233,&H80000800, &H80003FFF ' zeta(20)
                !dd &H4849D924, &H34AEACA0,&H80000400, &H80003FFF ' zeta(21)
                !dd &HEF97539F, &H118CD9D8,&H80000200, &H80003FFF ' zeta(22)
                !dd &H58C5A6C3, &H05D8F138,&H80000100, &H80003FFF ' zeta(23)
                !dd &HF08FB507, &H01F2CFFE,&H80000080, &H80003FFF ' zeta(24)
                !dd &H58CC8BDE, &H00A63A95,&H80000040, &H80003FFF ' zeta(25)
                !dd &H99B32034, &H0037662D,&H80000020, &H80003FFF ' zeta(26)
                !dd &H0844A7F5, &H001276B9,&H80000010, &H80003FFF ' zeta(27)
                !dd &H2D715CA9, &H00062768,&H80000008, &H80003FFF ' zeta(28)
                !dd &H06A1AAFE, &H00020D18,&H80000004, &H80003FFF ' zeta(29)
                !dd &H55D7C2AB, &H0000AF05,&H80000002, &H80003FFF ' zeta(30)
                !dd &H719B966E, &H00003A56,&H80000001, &H80003FFF ' zeta(31)
                !dd &HFB227A6B, &H80001371,&H80000000, &H80003FFF ' zeta(32)
                !dd &H490804B8, &H4000067B,&H80000000, &H80003FFF ' zeta(33)
                !dd &H15ACA522, &H20000229,&H80000000, &H80003FFF ' zeta(34)
                !dd &H5BE41382, &H100000B8,&H80000000, &H80003FFF ' zeta(35)
                !dd &H73CBFF66, &H0800003D,&H80000000, &H80003FFF ' zeta(36)
                !dd &H7BE3FE61, &H04000014,&H80000000, &H80003FFF ' zeta(37)
                !dd &HD3F3FF2D, &H02000006,&H80000000, &H80003FFF ' zeta(38)
                !dd &H46A5FFAB, &H01000002,&H80000000, &H80003FFF ' zeta(39)
                !dd &HC2372A8B, &H00800000,&H80000000, &H80003FFF ' zeta(40)
                !dd &H40BD0383, &H00400000,&H80000000, &H80003FFF ' zeta(41)
                !dd &H159453D6, &H00200000,&H80000000, &H80003FFF ' zeta(42)
                !dd &H0731709D, &H00100000,&H80000000, &H80003FFF ' zeta(43)
                !dd &H0265D00A, &H00080000,&H80000000, &H80003FFF ' zeta(44)
                !dd &H00CC9AA3, &H00040000,&H80000000, &H80003FFF ' zeta(45)
                !dd &H00443389, &H00020000,&H80000000, &H80003FFF ' zeta(46)
                !dd &H0016BBD8, &H00010000,&H80000000, &H80003FFF ' zeta(47)
                !dd &H000793F2, &H00008000,&H80000000, &H80003FFF ' zeta(48)
                !dd &H000286A6, &H00004000,&H80000000, &H80003FFF ' zeta(49)
                !dd &H0000D78D, &H00002000,&H80000000, &H80003FFF ' zeta(50)
                !dd &H000047DA, &H00001000,&H80000000, &H80003FFF ' zeta(51)
                !dd &H000017F3, &H00000800,&H80000000, &H80003FFF ' zeta(52)
                !dd &H000007FC, &H00000400,&H80000000, &H80003FFF ' zeta(53)
                !dd &H000002A9, &H00000200,&H80000000, &H80003FFF ' zeta(54)
                !dd &H000000E3, &H00000100,&H80000000, &H80003FFF ' zeta(55)
                !dd &H0000004C, &H00000080,&H80000000, &H80003FFF ' zeta(56)
                !dd &H00000019, &H00000040,&H80000000, &H80003FFF ' zeta(57)
                !dd &H00000008, &H00000020,&H80000000, &H80003FFF ' zeta(58)
                !dd &H00000003, &H00000010,&H80000000, &H80003FFF ' zeta(59)
                !dd &H00000001, &H00000008,&H80000000, &H80003FFF ' zeta(60)
                !dd &H00000000, &H00000004,&H80000000, &H80003FFF ' zeta(61)
                !dd &H00000000, &H00000002,&H80000000, &H80003FFF ' zeta(62)
                !dd &H00000000, &H00000001,&H80000000, &H80003FFF ' zeta(63)
                !dd &H80000000, &H00000000,&H80000000, &H80003FFF ' zeta(64)
                !dd &H40000000, &H00000000,&H80000000, &H80003FFF ' zeta(65)
                !dd &H20000000, &H00000000,&H80000000, &H80003FFF ' zeta(66)
                !dd &H10000000, &H00000000,&H80000000, &H80003FFF ' zeta(67)
                !dd &H08000000, &H00000000,&H80000000, &H80003FFF ' zeta(68)
                !dd &H04000000, &H00000000,&H80000000, &H80003FFF ' zeta(69)
                !dd &H02000000, &H00000000,&H80000000, &H80003FFF ' zeta(70)
                !dd &H01000000, &H00000000,&H80000000, &H80003FFF ' zeta(71)
                !dd &H00800000, &H00000000,&H80000000, &H80003FFF ' zeta(72)
                !dd &H00400000, &H00000000,&H80000000, &H80003FFF ' zeta(73)
                !dd &H00200000, &H00000000,&H80000000, &H80003FFF ' zeta(74)
                !dd &H00100000, &H00000000,&H80000000, &H80003FFF ' zeta(75)
                !dd &H00080000, &H00000000,&H80000000, &H80003FFF ' zeta(76)
                !dd &H00040000, &H00000000,&H80000000, &H80003FFF ' zeta(77)
                !dd &H00020000, &H00000000,&H80000000, &H80003FFF ' zeta(78)
                !dd &H00010000, &H00000000,&H80000000, &H80003FFF ' zeta(79)
                !dd &H00008000, &H00000000,&H80000000, &H80003FFF ' zeta(80)
                !dd &H00004000, &H00000000,&H80000000, &H80003FFF ' zeta(81)
                !dd &H00002000, &H00000000,&H80000000, &H80003FFF ' zeta(82)
                !dd &H00001000, &H00000000,&H80000000, &H80003FFF ' zeta(83)
                !dd &H00000800, &H00000000,&H80000000, &H80003FFF ' zeta(84)
                !dd &H00000400, &H00000000,&H80000000, &H80003FFF ' zeta(85)
                !dd &H00000200, &H00000000,&H80000000, &H80003FFF ' zeta(86)
                !dd &H00000100, &H00000000,&H80000000, &H80003FFF ' zeta(87)
                !dd &H00000080, &H00000000,&H80000000, &H80003FFF ' zeta(88)
                !dd &H00000040, &H00000000,&H80000000, &H80003FFF ' zeta(89)
                !dd &H00000020, &H00000000,&H80000000, &H80003FFF ' zeta(90)
                !dd &H00000010, &H00000000,&H80000000, &H80003FFF ' zeta(91)
                !dd &H00000008, &H00000000,&H80000000, &H80003FFF ' zeta(92)
                !dd &H00000004, &H00000000,&H80000000, &H80003FFF ' zeta(93)
                !dd &H00000002, &H00000000,&H80000000, &H80003FFF ' zeta(94)
                !dd &H00000001, &H00000000,&H80000000, &H80003FFF ' zeta(95)
                !dd &H00000001, &H00000000,&H80000000, &H80003FFF ' zeta(96)
                !dd &H00000000, &H00000000,&H80000000, &H80003FFF ' One
                Code:
                ' Dirichlet beta(n) function. 0<=n<=61, One
                !dd &H00000000, &H00000000,&H80000000, &H80003FFE ' beta(0)=1/2
                !dd &HC4C6628C, &H2168C234,&HC90FDAA2, &H80003FFE ' beta(1)
                !dd &H215822E3, &H409AE845,&HEA7CB89F, &H80003FFE ' beta(2)=Catalan's constant
                !dd &H0CAAC72A, &HC4EBE0F0,&HF80CDAC9, &H80003FFE ' beta(3)
                !dd &H2625D8D7, &H4911C316,&HFD2B785B, &H80003FFE ' beta(4)
                !dd &H82C1759B, &H3ED806C4,&HFF04330D, &H80003FFE ' beta(5)
                !dd &H932EC5FC, &H6D3B2FAB,&HFFA9D5B0, &H80003FFE ' beta(6)
                !dd &HA0210FBE, &HF590F0A4,&HFFE2CDE1, &H80003FFE ' beta(7)
                !dd &H6E9D4B84, &H041C019A,&HFFF62B41, &H80003FFE ' beta(8)
                !dd &H97A840C0, &H3AC998D8,&HFFFCB3D7, &H80003FFE ' beta(9)
                !dd &H04F3EF1F, &H0B09DD67,&HFFFEE58A, &H80003FFE ' beta(10)
                !dd &H8CB51301, &HB2500765,&HFFFFA1A0, &H80003FFE ' beta(11)
                !dd &HDEB7ED17, &H8EA3740F,&HFFFFE07F, &H80003FFE ' beta(12)
                !dd &H8EA8A4DF, &H9012C48E,&HFFFFF57D, &H80003FFE ' beta(13)
                !dd &HD4C034C3, &HBA0033EA,&HFFFFFC7E, &H80003FFE ' beta(14)
                !dd &HD01735FE, &HD0F24CCD,&HFFFFFED4, &H80003FFE ' beta(15)
                !dd &H4292BFC2, &H40E35244,&HFFFFFF9C, &H80003FFE ' beta(16)
                !dd &HEA1A05ED, &HBF5765EA,&HFFFFFFDE, &H80003FFE ' beta(17)
                !dd &HB968CAA0, &HEA418066,&HFFFFFFF4, &H80003FFE ' beta(18)
                !dd &H508D0D07, &H4E0C0732,&HFFFFFFFC, &H80003FFE ' beta(19)
                !dd &HF73CFE97, &HC4ACB689,&HFFFFFFFE, &H80003FFE ' beta(20)
                !dd &HF1323DA7, &H96E3D845,&HFFFFFFFF, &H80003FFE ' beta(21)
                !dd &HD1584E62, &HDCF6894C,&HFFFFFFFF, &H80003FFE ' beta(22)
                !dd &H8CEA7A15, &HF45229BD,&HFFFFFFFF, &H80003FFE ' beta(23)
                !dd &HFCF219D0, &HFC1B6270,&HFFFFFFFF, &H80003FFE ' beta(24)
                !dd &HBFE8B350, &HFEB3CB51,&HFFFFFFFF, &H80003FFE ' beta(25)
                !dd &HAA8DFAE3, &HFF9143BD,&HFFFFFFFF, &H80003FFE ' beta(26)
                !dd &HE7BAF6B9, &HFFDB1692,&HFFFFFFFF, &H80003FFE ' beta(27)
                !dd &HA369EAD5, &HFFF3B230,&HFFFFFFFF, &H80003FFE ' beta(28)
                !dd &H259239A3, &HFFFBE610,&HFFFFFFFF, &H80003FFE ' beta(29)
                !dd &H5E7A18D7, &HFFFEA205,&HFFFFFFFF, &H80003FFE ' beta(30)
                !dd &H1ED0F74B, &HFFFF8B57,&HFFFFFFFF, &H80003FFE ' beta(31)
                !dd &H0A230A9E, &HFFFFD91D,&HFFFFFFFF, &H80003FFE ' beta(32)
                !dd &HAE04C1F5, &HFFFFF309,&HFFFFFFFF, &H80003FFE ' beta(33)
                !dd &HE4AADE33, &HFFFFFBAD,&HFFFFFFFF, &H80003FFE ' beta(34)
                !dd &H4C38ADD8, &HFFFFFE8F,&HFFFFFFFF, &H80003FFE ' beta(35)
                !dd &H19682BC5, &HFFFFFF85,&HFFFFFFFF, &H80003FFE ' beta(36)
                !dd &H08780BC1, &HFFFFFFD7,&HFFFFFFFF, &H80003FFE ' beta(37)
                !dd &H5828035A, &HFFFFFFF2,&HFFFFFFFF, &H80003FFE ' beta(38)
                !dd &H72B80101, &HFFFFFFFB,&HFFFFFFFF, &H80003FFE ' beta(39)
                !dd &H7B92AAFA, &HFFFFFFFE,&HFFFFFFFF, &H80003FFE ' beta(40)
                !dd &H7E8638FD, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(41)
                !dd &HD4D76854, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(42)
                !dd &HF19D22C7, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(43)
                !dd &HFB3460ED, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(44)
                !dd &HFE66CAFA, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(45)
                !dd &HFF7798FE, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(46)
                !dd &HFFD28855, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(47)
                !dd &HFFF0D81C, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(48)
                !dd &HFFFAF2B4, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(49)
                !dd &HFFFE50E7, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(50)
                !dd &HFFFF704D, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(51)
                !dd &HFFFFD01A, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(52)
                !dd &HFFFFF009, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(53)
                !dd &HFFFFFAAE, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(54)
                !dd &HFFFFFE3A, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(55)
                !dd &HFFFFFF69, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(56)
                !dd &HFFFFFFCE, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(57)
                !dd &HFFFFFFEF, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(58)
                !dd &HFFFFFFFA, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(59)
                !dd &HFFFFFFFE, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(60)
                !dd &HFFFFFFFF, &HFFFFFFFF,&HFFFFFFFF, &H80003FFE ' beta(61)
                !dd &H00000000, &H00000000,&H80000000, &H80003FFF ' One
                In some cases, zeta(n)-1 is needed and since zeta(n) is near one. Below is a table of zeta(n)-1 to 96-bit significand precision. Higher values are equal to 2^-n and can be created by PowerOfTwo96A() in an earlier post.

                Code:
                !dd &H00000000, &H00000000,&H80000000, &H8000BFFE ' zeta(0)-1=-1/2
                !dd &H00000000, &H00000000,&H80000000, &H81007FFF ' zeta(1)-1=Infinity
                !dd &HE7B12244, &H307D3230,&HA51A6625, &H80003FFE ' zeta(2)-1
                !dd &HC5C57168, &H01884E0D,&HCEE8013C, &H80003FFC ' zeta(3)-1
                !dd &H91211197, &HEC241B5F,&HA8991563, &H80003FFB ' zeta(4)-1
                !dd &H304E3D1A, &H7CCDB7A2,&H97418ECA, &H80003FFA ' zeta(5)-1
                !dd &H65E16A02, &H24891EFB,&H8E130981, &H80003FF9 ' zeta(6)-1
                !dd &HFD66A217, &H3CE236A6,&H88CB6853, &H80003FF8 ' zeta(7)-1
                !dd &HCE526EDB, &H1CB745F2,&H859B57C3, &H80003FF7 ' zeta(8)-1
                !dd &HA0FBB1CD, &H6B5702FF,&H839F3D81, &H80003FF6 ' zeta(9)-1
                !dd &H3E60A860, &H772FC302,&H825C674B, &H80003FF5 ' zeta(10)-1
                !dd &H2718B09D, &H2CCAA238,&H818C6F92, &H80003FF4 ' zeta(11)-1
                !dd &H841785C3, &H69820CDC,&H81052D96, &H80003FF3 ' zeta(12)-1
                !dd &H32C8FB46, &HBBDEB063,&H80AC9D08, &H80003FF2 ' zeta(13)-1
                !dd &HC21C535A, &HA70AB0F0,&H80725795, &H80003FF1 ' zeta(14)-1
                !dd &H7A2EBFA9, &H88DF6855,&H804BDE5F, &H80003FF0 ' zeta(15)-1
                !dd &H156AFFDC, &H917879D0,&H803266F5, &H80003FEF ' zeta(16)-1
                !dd &HC49027BE, &H4334069B,&H8021839B, &H80003FEE ' zeta(17)-1
                !dd &HD70E6657, &HBA265C94,&H80164CA9, &H80003FED ' zeta(18)-1
                !dd &H0F8F6532, &HCDD24F22,&H800ED847, &H80003FEC ' zeta(19)-1
                !dd &HF0DBD904, &H23374C43,&H8009E2CA, &H80003FEB ' zeta(20)-1
                !dd &H24839A5D, &H9409093B,&H800695D5, &H80003FEA ' zeta(21)-1
                !dd &HE7D23E3C, &H763BE5D4,&H80046336, &H80003FE9 ' zeta(22)-1
                !dd &H61A9B0A9, &H9C2C62D3,&H8002EC78, &H80003FE8 ' zeta(23)-1
                !dd &H07671461, &HFEF08FB5,&H8001F2CF, &H80003FE7 ' zeta(24)-1
                !dd &HBC5BF6B0, &H2AB19917,&H80014C75, &H80003FE6 ' zeta(25)-1
                !dd &HCE750DE1, &HB666CC80,&H8000DD98, &H80003FE5 ' zeta(26)-1
                !dd &HA97F12AF, &HC842253F,&H800093B5, &H80003FE4 ' zeta(27)-1
                !dd &H8E4913F9, &H82D715CA,&H80006276, &H80003FE3 ' zeta(28)-1
                !dd &HBEB7D763, &H00D4355F,&H800041A3, &H80003FE2 ' zeta(29)-1
                !dd &HD9CF156D, &H5575F0AA,&H80002BC1, &H80003FE1 ' zeta(30)-1
                !dd &HE805FD4F, &H38CDCB36,&H80001D2B, &H80003FE0 ' zeta(31)-1
                !dd &H8D4C0A99, &HFB227A6A,&H80001371, &H80003FDF ' zeta(32)-1
                !dd &H2C8E88E0, &H92100970,&H80000CF6, &H80003FDE ' zeta(33)-1
                !dd &H2D221474, &H56B29487,&H800008A4, &H80003FDD ' zeta(34)-1
                !dd &H10E9CE3B, &HDF209C0F,&H800005C2, &H80003FDC ' zeta(35)-1
                !dd &HD7CFAE92, &H3CBFF65E,&H800003D7, &H80003FDB ' zeta(36)-1
                !dd &H03E4B5A5, &H7C7FCC21,&H8000028F, &H80003FDA ' zeta(37)-1
                !dd &H80378568, &HFCFFCB3E,&H800001B4, &H80003FD9 ' zeta(38)-1
                !dd &HA7B0B8F9, &H52FFD58F,&H80000123, &H80003FD8 ' zeta(39)-1
                !dd &HA6AC8BAC, &H372A8B77,&H800000C2, &H80003FD7 ' zeta(40)-1
                !dd &H81030014, &H7A07067B,&H80000081, &H80003FD6 ' zeta(41)-1
                !dd &HA5C43949, &H514F5930,&H80000056, &H80003FD5 ' zeta(42)-1
                !dd &HD41FF6FA, &H8B84E5F0,&H80000039, &H80003FD4 ' zeta(43)-1
                !dd &H2E028128, &H5D009938,&H80000026, &H80003FD3 ' zeta(44)-1
                !dd &HD6899323, &H9354661D,&H80000019, &H80003FD2 ' zeta(45)-1
                !dd &HD89FBFCA, &H0CE24410,&H80000011, &H80003FD1 ' zeta(46)-1
                !dd &H0334EF43, &H5DEBD80A,&H8000000B, &H80003FD0 ' zeta(47)-1
                !dd &H8564B718, &H93F2655B,&H80000007, &H80003FCF ' zeta(48)-1
                !dd &HD1B32724, &H0D4C2E3C,&H80000005, &H80003FCE ' zeta(49)-1
                !dd &H22824638, &H5E32BED3,&H80000003, &H80003FCD ' zeta(50)-1
                !dd &H0F05E873, &H3ECC79E2,&H80000002, &H80003FCC ' zeta(51)-1
                !dd &H5C27D8F3, &H7F32F941,&H80000001, &H80003FCB ' zeta(52)-1
                !dd &HE6D399F5, &HFF774F80,&H80000000, &H80003FCA ' zeta(53)-1
                !dd &H440A48C4, &HAA4F89AB,&H80000000, &H80003FC9 ' zeta(54)-1
                !dd &H2D27E079, &H718A5B72,&H80000000, &H80003FC8 ' zeta(55)-1
                !dd &H735AFE3A, &H4BB19221,&H80000000, &H80003FC7 ' zeta(56)-1
                !dd &H4CDEF578, &H32766156,&H80000000, &H80003FC6 ' zeta(57)-1
                !dd &H88914A94, &H21A440D9,&H80000000, &H80003FC5 ' zeta(58)-1
                !dd &HB05F8590, &H166D808B,&H80000000, &H80003FC4 ' zeta(59)-1
                !dd &H203F253F, &H0EF3AB05,&H80000000, &H80003FC3 ' zeta(60)-1
                !dd &H6AD48CA5, &H09F7C757,&H80000000, &H80003FC2 ' zeta(61)-1
                !dd &HF1E2F27D, &H06A52F8E,&H80000000, &H80003FC1 ' zeta(62)-1
                !dd &H4BEC98E2, &H046E1FB4,&H80000000, &H80003FC0 ' zeta(63)-1
                !dd &HB29DB7BF, &H02F41522,&H80000000, &H80003FBF ' zeta(64)-1
                !dd &H0C6923C2, &H01F80E17,&H80000000, &H80003FBE ' zeta(65)-1
                !dd &HA8461747, &H01500964,&H80000000, &H80003FBD ' zeta(66)-1
                !dd &H15840F4B, &H00E00643,&H80000000, &H80003FBC ' zeta(67)-1
                !dd &H0BAD5F70, &H00955982,&H80000000, &H80003FBB ' zeta(68)-1
                !dd &H5BC8EA42, &H00639101,&H80000000, &H80003FBA ' zeta(69)-1
                !dd &H91DB46D3, &H004260AB,&H80000000, &H80003FB9 ' zeta(70)-1
                !dd &H60E7848B, &H002C4072,&H80000000, &H80003FB8 ' zeta(71)-1
                !dd &H406FADB1, &H001D804C,&H80000000, &H80003FB7 ' zeta(72)-1
                !dd &H80351E76, &H0013AADD,&H80000000, &H80003FB6 ' zeta(73)-1
                !dd &HAAC369A4, &H000D1C93,&H80000000, &H80003FB5 ' zeta(74)-1
                !dd &HC7279BC3, &H0008BDB7,&H80000000, &H80003FB4 ' zeta(75)-1
                !dd &HDA17BD2C, &H0005D3CF,&H80000000, &H80003FB3 ' zeta(76)-1
                !dd &H9163D373, &H0003E28A,&H80000000, &H80003FB2 ' zeta(77)-1
                !dd &H0B9737A2, &H00029707,&H80000000, &H80003FB1 ' zeta(78)-1
                !dd &HB2647A6C, &H0001BA04,&H80000000, &H80003FB0 ' zeta(79)-1
                !dd &HCC42D19D, &H000126AD,&H80000000, &H80003FAF ' zeta(80)-1
                !dd &HDD81CBBE, &H0000C473,&H80000000, &H80003FAE ' zeta(81)-1
                !dd &HE90127D4, &H000082F7,&H80000000, &H80003FAD ' zeta(82)-1
                !dd &HF0AB6A8D, &H0000574F,&H80000000, &H80003FAC ' zeta(83)-1
                !dd &H4B1CEF09, &H00003A35,&H80000000, &H80003FAB ' zeta(84)-1
                !dd &H321348B1, &H000026CE,&H80000000, &H80003FAA ' zeta(85)-1
                !dd &HCC0CDA76, &H000019DE,&H80000000, &H80003FA9 ' zeta(86)-1
                !dd &H32B33BF9, &H0000113F,&H80000000, &H80003FA8 ' zeta(87)-1
                !dd &H772227D1, &H00000B7F,&H80000000, &H80003FA7 ' zeta(88)-1
                !dd &H4F6C1A76, &H000007AA,&H80000000, &H80003FA6 ' zeta(89)-1
                !dd &H34F2BC44, &H0000051C,&H80000000, &H80003FA5 ' zeta(90)-1
                !dd &H234C7D7D, &H00000368,&H80000000, &H80003FA4 ' zeta(91)-1
                !dd &H6CDDA8FC, &H00000245,&H80000000, &H80003FA3 ' zeta(92)-1
                !dd &H9DE91B51, &H00000183,&H80000000, &H80003FA2 ' zeta(93)-1
                !dd &H69461235, &H00000102,&H80000000, &H80003FA1 ' zeta(94)-1
                !dd &H462EB6CE, &H000000AC,&H80000000, &H80003FA0 ' zeta(95)-1
                !dd &HD97479DE, &H00000072,&H80000000, &H80003F9F ' zeta(96)-1
                !dd &H90F8513F, &H0000004C,&H80000000, &H80003F9E ' zeta(97)-1
                !dd &H0B50362A, &H00000033,&H80000000, &H80003F9D ' zeta(98)-1
                !dd &H078ACEC7, &H00000022,&H80000000, &H80003F9C ' zeta(99)-1
                !dd &HAFB1DF2F, &H00000016,&H80000000, &H80003F9B ' zeta(100)-1
                !dd &H1FCBEA1F, &H0000000F,&H80000000, &H80003F9A ' zeta(101)-1
                !dd &H15329C15, &H0000000A,&H80000000, &H80003F99 ' zeta(102)-1
                !dd &HB8CC680E, &H00000006,&H80000000, &H80003F98 ' zeta(103)-1
                !dd &H7B32F009, &H00000004,&H80000000, &H80003F97 ' zeta(104)-1
                !dd &HFCCCA006, &H00000002,&H80000000, &H80003F96 ' zeta(105)-1
                !dd &HFDDDC004, &H00000001,&H80000000, &H80003F95 ' zeta(106)-1
                !dd &H53E92AAD, &H00000001,&H80000000, &H80003F94 ' zeta(107)-1
                !dd &HE29B71C9, &H00000000,&H80000000, &H80003F93 ' zeta(108)-1
                !dd &H97124BDB, &H00000000,&H80000000, &H80003F92 ' zeta(109)-1
                !dd &H64B6DD3D, &H00000000,&H80000000, &H80003F91 ' zeta(110)-1
                !dd &H4324937E, &H00000000,&H80000000, &H80003F90 ' zeta(111)-1
                !dd &H2CC30CFF, &H00000000,&H80000000, &H80003F8F ' zeta(112)-1
                !dd &H1DD75DFF, &H00000000,&H80000000, &H80003F8E ' zeta(113)-1
                !dd &H13E4E955, &H00000000,&H80000000, &H80003F8D ' zeta(114)-1
                !dd &H0D434638, &H00000000,&H80000000, &H80003F8C ' zeta(115)-1
                !dd &H08D78426, &H00000000,&H80000000, &H80003F8B ' zeta(116)-1
                !dd &H05E502C4, &H00000000,&H80000000, &H80003F8A ' zeta(117)-1
                !dd &H03EE01D8, &H00000000,&H80000000, &H80003F89 ' zeta(118)-1
                !dd &H029EABE5, &H00000000,&H80000000, &H80003F88 ' zeta(119)-1
                !dd &H01BF1D43, &H00000000,&H80000000, &H80003F87 ' zeta(120)-1
                !dd &H012A1382, &H00000000,&H80000000, &H80003F86 ' zeta(121)-1
                !dd &H00C6B7AC, &H00000000,&H80000000, &H80003F85 ' zeta(122)-1
                !dd &H00847A73, &H00000000,&H80000000, &H80003F84 ' zeta(123)-1
                !dd &H005851A2, &H00000000,&H80000000, &H80003F83 ' zeta(124)-1
                !dd &H003AE117, &H00000000,&H80000000, &H80003F82 ' zeta(125)-1
                !dd &H002740BA, &H00000000,&H80000000, &H80003F81 ' zeta(126)-1
                !dd &H001A2B26, &H00000000,&H80000000, &H80003F80 ' zeta(127)-1
                !dd &H0011721A, &H00000000,&H80000000, &H80003F7F ' zeta(128)-1
                !dd &H000BA166, &H00000000,&H80000000, &H80003F7E ' zeta(129)-1
                !dd &H0007C0EF, &H00000000,&H80000000, &H80003F7D ' zeta(130)-1
                !dd &H00052B4A, &H00000000,&H80000000, &H80003F7C ' zeta(131)-1
                !dd &H00037231, &H00000000,&H80000000, &H80003F7B ' zeta(132)-1
                !dd &H00024C21, &H00000000,&H80000000, &H80003F7A ' zeta(133)-1
                !dd &H00018816, &H00000000,&H80000000, &H80003F79 ' zeta(134)-1
                !dd &H00010564, &H00000000,&H80000000, &H80003F78 ' zeta(135)-1
                !dd &H0000AE43, &H00000000,&H80000000, &H80003F77 ' zeta(136)-1
                !dd &H0000742C, &H00000000,&H80000000, &H80003F76 ' zeta(137)-1
                !dd &H00004D73, &H00000000,&H80000000, &H80003F75 ' zeta(138)-1
                !dd &H000033A2, &H00000000,&H80000000, &H80003F74 ' zeta(139)-1
                !dd &H0000226C, &H00000000,&H80000000, &H80003F73 ' zeta(140)-1
                !dd &H000016F3, &H00000000,&H80000000, &H80003F72 ' zeta(141)-1
                !dd &H00000F4C, &H00000000,&H80000000, &H80003F71 ' zeta(142)-1
                !dd &H00000A33, &H00000000,&H80000000, &H80003F70 ' zeta(143)-1
                !dd &H000006CD, &H00000000,&H80000000, &H80003F6F ' zeta(144)-1
                !dd &H00000488, &H00000000,&H80000000, &H80003F6E ' zeta(145)-1
                !dd &H00000306, &H00000000,&H80000000, &H80003F6D ' zeta(146)-1
                !dd &H00000204, &H00000000,&H80000000, &H80003F6C ' zeta(147)-1
                !dd &H00000158, &H00000000,&H80000000, &H80003F6B ' zeta(148)-1
                !dd &H000000E5, &H00000000,&H80000000, &H80003F6A ' zeta(149)-1
                !dd &H00000099, &H00000000,&H80000000, &H80003F69 ' zeta(150)-1
                !dd &H00000066, &H00000000,&H80000000, &H80003F68 ' zeta(151)-1
                !dd &H00000044, &H00000000,&H80000000, &H80003F67 ' zeta(152)-1
                !dd &H0000002D, &H00000000,&H80000000, &H80003F66 ' zeta(153)-1
                !dd &H0000001E, &H00000000,&H80000000, &H80003F65 ' zeta(154)-1
                !dd &H00000014, &H00000000,&H80000000, &H80003F64 ' zeta(155)-1
                !dd &H0000000D, &H00000000,&H80000000, &H80003F63 ' zeta(156)-1
                !dd &H00000009, &H00000000,&H80000000, &H80003F62 ' zeta(157)-1
                !dd &H00000006, &H00000000,&H80000000, &H80003F61 ' zeta(158)-1
                !dd &H00000004, &H00000000,&H80000000, &H80003F60 ' zeta(159)-1
                !dd &H00000003, &H00000000,&H80000000, &H80003F5F ' zeta(160)-1
                !dd &H00000002, &H00000000,&H80000000, &H80003F5E ' zeta(161)-1
                !dd &H00000001, &H00000000,&H80000000, &H80003F5D ' zeta(162)-1
                !dd &H00000001, &H00000000,&H80000000, &H80003F5C ' zeta(163)-1
                !dd &H00000001, &H00000000,&H80000000, &H80003F5B ' zeta(164)-1
                ' Continue with zeta(n)-1 = 2^-n
                Several formulas involving the zeta function simplify if zeta(1) is replaced with Euler's constant (gamma=0.5772...) so here are gamma and gamma-1.

                Code:
                !dd &HD1BE3F81, &H7DB0C7A4,&H93C467E3, &H80003FFE ' gamma
                !dd &H5C8380FE, &H049E70B6,&HD8773039, &H8000BFFD ' gamma-1
                There are several sources for general information. I have used extensively:

                Milton Abramowitz and Irene A. Stegun, "Handbook of Mathematical
                Functions With Formulas, Graphs, and Mathematical Tables", National
                Bureau of Standards, Applied Mathematics Series, 55.
                http://www.convertit.com/Go/Bioresea...ence/AMS55.ASP
                http://www.math.ucla.edu/~cbm/aands/ (Incomplete)

                N.J.A. Sloane, "The On-Line Encyclopedia of Integer Sequences", AT&T
                Shannon Lab.
                http://research.att.com/~njas/sequences/

                Eric Weisstein, "Wolfram MathWorld", Wolfram Research.
                http://mathworld.wolfram.com/

                Values of the first 1000 Bernoulli and Euler numbers are given in:

                Simon Plouffe, "Table of the first 1000 Bernnoulli [sic] Numbers
                (omitting the odd ones)".
                http://pi.lacim.uqam.ca/piDATA/Bernoulli2to1000.txt

                John Crosby Lincoln, "The First 1000 Euler Numbers", Project Gutenberg.
                http://infomotions.com/etexts/gutenb...01/euler10.htm

                Values of the Riemann zeta function for odd arguments are in

                Robert J. Harley, "Zeta(3) to Zeta(99) to 10000 digits".
                http://pi.lacim.uqam.ca/piDATA/zeta3to99.txt

                Values of the numerator and denominator, respectively, to compute the Riemann zeta function for even arguments are in

                T. D. Noe, "Table of n, a(n) for n=1..100".
                http://www.research.att.com/~njas/sequences/b046988.txt
                http://www.research.att.com/~njas/sequences/b002432.txt

                Values of the numerator and denominator, respectively, to compute the Dirichlet beta function for odd arguments are in

                T. D. Noe, "Table of n, a(n) for n=1..100".
                http://www.research.att.com/~njas/sequences/b046976.txt
                http://www.research.att.com/~njas/sequences/A053005 (14 terms only)

                Values of the Dirichlet beta function for even arguments were computed using a combination of string arithmetic for initial terms and PBCC for later terms. Also beta(4) is in
                http://pi.lacim.uqam.ca/piDATA/beta4.txt

                There are numerous sources for pi, Euler's, and Catalan's constants.

                ________________
                Mark Longley-Cook
                Last edited by Mark Longley-Cook; 12 Mar 2009, 01:30 PM. Reason: See first paragraph.

                Comment


                • #9
                  Revised Convert96T(), String96T(), Convert96A(), Sign96A() and StringAdd() functions.

                  It is too late to edit my posts that contained these functions. The 96-bit significand functions were revised to correctly test for optional parameters. The string arithmetic function needed an additional test to correctly reorder the parameters. Edit of 3/17/09: See last paragraph for an error in the zeta()-1 table posted 3/2/09 on "96-Bit Significand -- Bernoulli, Euler, zeta, beta. ".

                  The omitted ByVal was added to String96T() function so the optional parameter is assured to be zero. Optional string parameters were incorrectly tested and could result in a General Protection Fault (GPF). This effects Convert96T() and Convert96A(). In Convert96A() the revision is made in the first executable statement changing
                  If "s"<>"" Then
                  to
                  If VarPtr(s)<>0 Then
                  Although testing ArrayAttr(...(),0) in Sign96A() to determine if the second array was passed is in all likelihood valid, it may not conform with documentation so a revised function is provided that uses VarPtr() to test for the Array Descriptor Table (ADT). The change is from
                  If ArrayAttr(b(),0)=0 Then
                  to
                  If VarPtr(b())<>0 Then
                  Here are my current versions of the functions:

                  Code:
                  Function String96T(a As Type96, Opt ByVal o As Long) As String
                      ' Convert to string depending on option code.
                      Dim a96(3) As Dword At VarPtr(a)
                      Function=String96A(a96(), o)
                  End Function
                   
                  Function Convert96T(a As Type96, Opt s As String) As Ext
                      ' Convert in-situ extended-precision or long-integer or string.
                      ' This does not have to be called as is done internally.
                      Dim a96(3) As Dword At VarPtr(a)
                      If VarPtr(s) Then
                          Function=Convert96A(a96(), s)
                      Else
                          Function=Convert96A(a96())
                      End If
                  End Function
                   
                  Function Convert96A(a() As Dword, _ ' Input array
                       Opt s As String) As Ext        ' Input string does Val96A()
                      ' Called with all input arrays at start of functions.
                      ' Called with output array at end of functions.
                      ' Convert in-situ extended-precision in (a(3),a(2),a(1)) or
                      '     long integer in a(0) to 96-bit significand format.
                      ' Also checks bounds of input arrays.
                      ' Second parameter (IncrSig) intended for internal use.
                      '
                      ' Methodology:
                      ' If s is provided, immediately calls Val96A() to convert it.
                      ' a() checked for following possibilities in this order:
                      ' 1. If already has 96-bit significand signature bit set:
                      '     a. Set flag bits as required
                      '     b. If IncrSig is true (-1) round up copy of a()
                      '     c. Return rounded extended-precision value and exit
                      '     d. If rounding creates infinity, that flag is not set
                      ' 2. If a(3)=a(2)=a(1)=0 (includes extended of value +zero):
                      '     a. Treat a(0) as long integer value
                      '     b. Set signature bit
                      '     c. Set zero (if 0) and one (if -1 or +1) flag bits
                      '     d. Zero a(0) (no rounding required or possible)
                      '     e. Return extended-precision value and exit
                      ' 3. Otherwise
                      '     a. Treat (Lo(a(3)),a(2),a(1)) as extended-precision value
                      '     b. Set signature bit
                      '     c. Set one, zero, infinity, and NaN flag bits as required
                      '     d. Zero a(0) (no rounding required or possible)
                      '     e. Return extended-precision value and exit
                      '
                      Call CheckOut96A(a())
                      Local i As Long
                      Local sg As Long ' Sign
                      Dim b(3) As Dword ' Working copy if signature flag set
                      Dim wb(7) As Word At VarPtr(b(0)) ' wb(7)=flags; wb(6)=sign & exp.
                      Dim bb(0) As Ext At VarPtr(b(1))
                      Dim q64(0) As Quad At VarPtr(b(1)) ' Extended significand
                      Dim w64(0) As Word At VarPtr(b(3)) ' Extended sign/exponent
                      Dim wa(7) As Word At VarPtr(a(0)) ' w(7)=flags; w(6)=sign & exponent
                      Dim la(0) As Long At VarPtr(a(0))
                      Dim aa(0) As Ext At VarPtr(a(1))
                      '
                      ' Check if string input and use Val96A()
                      If VarPtr(s)<>0 Then
                          Call Val96A(a(), s)
                          If Bit(a(0),%FlagSig96)=0 Then ?"Error Val return": WaitKey$
                      End If
                      '
                      ' 1. Check if already in 96-bit significand format.
                      ' Since a() may be in protected memory, work on a copy.
                      If Bit(a(0),%FlagSig96) Then
                          ' General protection error will occur if
                          '     a() in protected momory and flags set incorrectly.
                          ' Make a working copy in unprotected memory.
                          For i=0 To 3: b(i)=a(i): Next i ' Copy96A() calls Convert96A()
                          If wb(6)=&HFFFF?? And wb(5)=>&HC000?? Then ' NaN
                              Reset b()
                              Bit Set b(0),%FlagSig96
                              Bit Set b(0),%FlagNaN96
                              For i=%FlagNor96-1 To %FlagNeg96: Bit Set b(0),i: Next i
                              Function=(0##/0##) ' All NaN's have sign bit set
                              GoSub CheckFlags
                              Exit Function
                          End If
                          If Bit(b(0),%FlagNeg96) Then sg=-1 Else sg=+1
                          b(3)=b(3) And &H00007FFF??? ' Clear flags and sign
                          If b(2)=0 And b(1)=0 And b(0)=0 Then
                              If b(3)<>0 Then ?"Error zero significand":WaitKey$
                              Reset b()
                              Bit Set b(0),%FlagSig96
                              Bit Set b(0),%FlagZer96
                              If sg=-1 Then Bit Set b(0),%FlagNeg96
                              Function=sg*0##
                              GoSub CheckFlags
                              Exit Function
                          End If
                          If b(3)=&H00007FFF??? Then
                              Reset b()
                              Bit Set b(0),%FlagSig96
                              Bit Set b(0),%FlagInf96
                              If sg=-1 Then Bit Set b(0),%FlagNeg96
                              For i=%FlagNor96 To %FlagNeg96-1: Bit Set b(0),i: Next i
                              Function=sg/0##
                              GoSub CheckFlags
                              Exit Function
                          End If
                          Bit Set b(0),%FlagSig96
                          If sg=-1 Then Bit Set b(0),%FlagNeg96
                          If Bit(b(0),%FlagNor96)=0 Then Bit Set b(0),%FlagDen96
                          Call BankersRounding96A(b())
                          GoSub CheckFlags
                          ' Use the working copy as scratch for rounding return value.
                          If Bit(b(0),%FlagInc96) Then
                              b(0)=&HFFFFFFFF??? ' Forces rounding of 64-bit significand
                              Call RoundUp96A(b())
                          End If
                          Function=bb(0) ' Altered b() is not a part of a()
                          Exit Function
                          CheckFlags: ' Check if flags correct:
                              i=0
                              If a(0)<>b(0) Or a(1)<>b(1) Or a(2)<>b(2) Then
                                  Incr i
                                  ? "Warning significands don't match":WaitKey$
                              End If
                              If Lo(Word,a(3))<>Lo(Word,a(3)) Then
                                  Incr i
                                  ? "Warning sign/exponents don't match":WaitKey$
                              End If
                              If Hi(Word,a(3))<>Hi(Word,a(3)) Then
                                  Incr i
                                  ? "Warning flags don't match":WaitKey$
                              End If
                              If i Then
                                  For i=0 To 3: a(i)=b(i): Next i
                              End If
                          Return
                      End If
                      '
                      ' 2. Check if long integer in a(0) (or +zero extended-precision).
                      If a(3)=0 And a(2)=0 And a(1)=0 Then
                          Bit Set a(0),%FlagSig96
                          Function=la(0)
                          Select Case a(0)
                          Case &H00000000& ' +Zero
                              Bit Set a(0),%FlagZer96 ' Zero
                              Exit Function
                          Case &H80000000& ' -2^31 (cannot simply negate)
                              wa(6)=&HC01E??: Swap a(2),a(0) ' So significand OK
                              Function=-2^31
                              Exit Function
                          End Select
                          wa(6)=&H401E?? ' &H3FFF+31=&H401E
                          If Bit(a(0),%FlagInc96) Then ' Bit 31 set if negative long
                              Bit Set a(0),%FlagNeg96: la(0)=-la(0)
                          End If
                          Do ' As Bit(a(0),%FlagInc96)=0, do loop done at least once.
                              Shift Left a(0),1
                              Decr wa(6)
                          Loop Until Bit(a(0),%FlagInc96) ' %FlagInc96-31
                          Swap a(2),a(0) ' Significand has MSB set and a(0)=0
                          Exit Function
                      End If
                      '
                      ' 3. Must be extended-precision (other than +zero).
                      wa(7)=0: a(0)=0 ' Clear flags and a(0)
                      Bit Set a(0),%FlagSig96
                      If wa(6)=&H8000?? And a(2)=0 And a(1)=0 Then
                          Bit Set a(0),%FlagZer96 ' -Zero
                      ElseIf a(2)=&H800000000??? And a(1)=0 Then
                          Select Case wa(6)
                          Case &H7FFF??,&HFFFF??: Bit Set a(0),%FlagInf96 ' Infinity
                          End Select
                      ElseIf Bit(a(0),%FlagNor96)=0 Then
                          Bit Set a(0),%FlagDen96 ' Denormal
                      ElseIf wa(6)=&HFFFF?? And wa(5)=>&HC000?? Then
                          wa(5)=&HC000??: Bit Set a(0),%FlagNaN96 ' NaN
                          For i=0 To 4: wa(i)=0: Next i
                      End If
                      Function=aa(0)
                      Exit Function
                  End Function
                   
                  Function Sign96A(a() As Dword, Opt b() As Dword) _ ' Input arrays
                      As Long                                        ' Output long
                      ' Output <-- Sgn(a()-b()) (or Sgn(a()) if b() not passed)
                      Call Convert96A(a())
                      Local i,j As Long
                      If Bit(a(0),%FlagNaN96) Then ? "Error NaN in Sign":WaitKey$
                      If VarPtr(b())<>0 Then
                          ' b() was passed. Return Sgn(a()-b())
                          Call Convert96A(b())
                          If Bit(b(0),%FlagNaN96) Then ? "Error NaN in Sign":WaitKey$
                          If Bit(a(0),%FlagZer96) And Bit(b(0),%FlagZer96) Then
                             Function=0: Exit Function
                          End If
                          j=IsTrue Bit(a(0),%FlagNeg96)
                          i=j Xor IsTrue(Bit(b(0),%FlagNeg96))
                          If i Then
                              i=1+2*j
                          Else
                              j=1+2*j
                              If (a(3)And&H00007FFF???)>(b(3)And&H00007FFF???) Then i=+j
                              If (a(3)And&H00007FFF???)<(b(3)And&H00007FFF???) Then i=-j
                              If i Then Exit If
                              If a(2)>b(2) Then i=+j
                              If a(2)<b(2) Then i=-j
                              If i Then Exit If
                              If a(1)>b(1) Then i=+j
                              If a(1)<b(1) Then i=-j
                              If i Then Exit If
                              If a(0)>b(0) Then i=+j
                              If a(0)<b(0) Then i=-j
                          End If
                      Else
                          ' b() was not passed. Return Sgn(a())
                          If Bit(a(0),%FlagZer96) Then
                              i=0
                          Else
                              i=1-2*Bit(a(0),%FlagNeg96)
                          End If
                      End If
                      Function=i
                  End Function
                  Below is a revised version of StringAdd(). The revision is in Case 0 of the Select Case kb block in order to correctly handle subtraction.

                  Code:
                  Function StringAdd(ByVal a As String, ByVal b As String) As String
                      ' Result <-- a+b where a and b are signed integer strings
                      Local n As Long:n=Asc("9")
                      Local z As Long:z=Asc("0")
                      Local sa,sb As Long
                      Local i,j,ka,kb As Long
                      a=StringPrepare(a, sa)
                      b=StringPrepare(b, sb)
                      If a="" And b="" Then Function="0": Exit Function
                      If a="" Then
                          If sb Then Function="-"+b Else Function=$Spc+b
                          Exit Function
                      End If
                      If b="" Then
                          If sa Then Function="-"+a Else Function=$Spc+a
                          Exit Function
                      End If
                      kb=Len(a)-Len(b)
                      Select Case kb
                      Case <0
                          Swap a,b: Swap sa,sb: kb=-kb
                      Case 0
                          If a=b And (sa Xor sb) Then Function="0": Exit Function
                          If a<b Then Swap a,b: Swap sa,sb
                      End Select
                      ka=Len(a)+1: kb=kb+2
                      a="0"+a: b=String$(kb-1,"0")+b
                      ' ka=length of a; kb=position of 1st non-zero in b (kb=>2).
                      If sa Xor sb Then
                          ' Subtract
                          For i=ka To kb Step -1
                              Asc(a,i)=Asc(a,i)-Asc(b,i)+z
                              If Asc(a,i)<z Then
                                  For j=i To 2 Step -1
                                      Asc(a,j)=Asc(a,j)+10
                                      Asc(a,j-1)=Asc(a,j-1)-1
                                      If Asc(a,j-1)=>z Then Exit For
                                  Next j
                              End If
                          Next i
                      Else
                          ' Add
                          For i=ka To kb Step -1
                              Asc(a,i)=Asc(a,i)+Asc(b,i)-z
                              If Asc(a,i)>n Then
                                  For j=i To 2 Step -1
                                      Asc(a,j)=Asc(a,j)-10
                                      Asc(a,j-1)=Asc(a,j-1)+1
                                      If Asc(a,j-1)<=n Then Exit For
                                  Next j
                              End If
                          Next i
                      End If
                      a=LTrim$(a,"0")
                      If sa Then Function="-"+a Else Function=$Spc+a
                  End Function
                  A foolish error in zeta()-1 table (the last table in my 3/2/09 post "96-Bit Significand -- Bernoulli, Euler, zeta, beta."). The Riemann zeta function of zero is -1/2 so, of course, zeta(0)-1=-3/2. Please change the first line in that table to read:
                  Code:
                  !dd &H00000000, &H00000000,&HC0000000, &H8000BFFF ' zeta(0)-1=-3/2
                  Sorry for any inconvenience. Remember, this whole thread is a work in progress.

                  _________________
                  Mark Longley-Cook
                  Last edited by Mark Longley-Cook; 17 Mar 2009, 03:30 PM. Reason: Additional error in "96-Bit Significand -- Bernoulli, Euler, zeta, beta."

                  Comment


                  • #10
                    String Arithmetic Square Root

                    This function extends the string arithmetic functions to include square root using Newton's method. A decimal point is needed (if not an integer) to distinguish between, say "1.2300000" and "12.300000".

                    The function calls other functions in the string arithmetic set. As with SquareRoot96A() 96-bit significand function, negative strings produce a negative result.

                    As an example of it's operation, try:
                    Code:
                    ' Metastatements omitted
                    Function PBMain() As Long
                    Local i As Long
                    Local s As String
                    s="2."+Repeat$(31,"0")
                    ? s
                    For i=1 To 10
                    s=StringSquareRoot(s)
                    ? s
                    Next i
                    WaitKey$
                    End Function
                    The last printed result is
                    1.0006771306930663566781727848745
                    while 2^(1/1024) on Microsoft's Calculator is
                    1.0006771306930663566781727848746
                    Precision is determined by the first parameter in the Repeat$(31,"0") statement.

                    Here is the function:
                    Code:
                    Function StringSquareRoot(ByVal a As String) As String
                        ' Result <-- Sgn(a)*Sqr(Abs(a)) using Newton's method.
                        ' Decimal point must be included unless integer.
                        ' Excluding commas, spaces, signs, decimal, and initial zeros,
                        '     Len(Result) = Len(a)
                        ' No rounding is done.
                        '
                        Local i, k As Long
                        Local l As Long ' l=Int(Log10(Abs(...)))
                        Local m As Long ' m = -1 if a<0, else 0
                        Local s, t, u As String
                        m=IsTrue(Tally(a,"-") And 1)
                        a=Remove$(a, Any "+- ,")
                        a=LTrim$(a,"0")
                        k=Len(Remove$(a,"."))
                        s=Remove$(a, Any "0123456789")
                        Select Case s
                        Case ""
                            l=Len(a)-1 ' l=>0
                        Case "."
                            If Asc(a)=Asc(".") Then
                                l=-InStr(a, Any "123456789")+1 ' l<0
                            Else
                                l=InStr(a,".")-2 ' l=>0
                            End If
                            a=Remove$(a,".")
                        Case Else
                            ? "Error Illegal character(s) ";s:WaitKey$
                        End Select
                        If Trim$(a,"0")="" Then Function="0": Exit Function
                        a+=String$((Len(a)\2)*2,"0")
                        ' Initial digit from root of 1.5,2.5,3.5,...9.5,15,25,...,85
                        If l Mod 2 = 0 Then
                            s=Mid$("122223333",Asc(LTrim$(a, "0"))-Asc("0"),1)
                        Else
                            ' Use 9 for 95 to keep code simple
                            s=Mid$("456778999",Asc(LTrim$(a, "0"))-Asc("0"),1)
                        End If
                        ' Create an even number of decimal digits
                        Select Case l
                        Case <0
                            If Len(a) Mod 2 Then a+="0"
                            l=(l-1)\2
                            s=String$(-l-1,"0")+s
                            s+=String$(Len(a)\2-Len(s),"0")
                        Case =>0
                            If Len(a) Mod 2=l Mod 2 Then a=a+"0"
                            l=l\2
                            s+=String$(l,"0")   '(Len(a)-l)\2-1,"0")
                            s+=String$(Len(a)\2-Len(s),"0")
                        End Select
                        Do
                            u=t
                            t=s
                            s=LTrim$(StringDivide(StringAdd(StringDivide(a,s),s),"2"))
                            If s=u And s<>t Then
                                ? "Warning Result is oscillating":WaitKey$
                                Exit Do
                            End If
                        Loop Until s=t
                        If l<0 Then
                            s="."+String$(-l-1,"0")+s
                        Else
                            s=Left$(s,l+1)+"."+Mid$(s,l+2)
                        End If
                        k-=Len(Remove$(s,"."))
                        If k<0 Then s=Left$(s,k)
                        If m Then s="-"+s
                        Function=s
                    End Function
                    _________________
                    Mark Longley-Cook

                    Comment


                    • #11
                      CAUTION: Use of #Debug Display On.

                      Edit of 4/20: If you might be using the debugger, be aware that an extra byte is added to each line. To avoid problems, put "#Debug Code Off" between "Exit Function" and "#Align 16". This turns off the debugger adding that extra byte until the end of the function.

                      Edit of 4/17: As 96-bit significand format used here is 16 bytes per value, the insertion of 14 bytes of code also fouls up the #Align 16 metastatement. This, however, is hardly a problem because (1) the #Align only provides a bit of speed and by its very nature #Debug Display On probably slows the program more, (2) these functions were never intended to be fast as they are esentially only intended to arrive at the best extended-precision values possible, and (3) if one really wants to insert between the #Align 16 and the label the following (assuming %Debug_Display is created):
                      #If %Debug_Display=14
                      !dw 0
                      #EndIf
                      By the way, another way to deal with the added code is to put the label at the end of the data and subtract the correct number of bytes from the CodePtr() reference, but I would find this more confusing if I came back later and tried to figure what was going on.

                      This applies to PBCC5.xx, and presumably PBWin9.xx. I make extensive use of storing constants inside code. This is fine unless you use #Debug Display On. This metastatement causes 14 bytes (with PBCC5) of code to be immediately inserted after every label. The code stores the 8 bytes of the label name with $Spc fill to be included in the stack. It also plays havoc with data alignment. If you are likely to use this option with my functions, please add to your template something like:
                      Code:
                      #If -1 ' Change to #If 0 when appropriate.
                          #Debug Display On
                          %Debug_Display=14
                      #Else
                          #Debug Display Off
                          %Debug_Display=0
                      #EndIf
                      And then you must add %Debug_Display to CodePtr(...) when you dimension the array. For assembly functions, insert !add ...,%Debug_Display after the !lea statement. Also confirm in later versions there is no change to the number 14 by checking the difference in CodePtr() results of two labels with nothing between them.

                      ________________
                      Mark Longley-Cook
                      Last edited by Mark Longley-Cook; 20 Apr 2009, 11:19 AM. Reason: See first paragraph.

                      Comment


                      • #12
                        Mathematical functions with high precision

                        Hi,

                        Great Job.
                        Is it possible post here an zip file with all the functions and demos that demonstrate how the functions works.

                        Do you have plans create an kind of ProMATH for PBCC compilers. I have very interested in an library of math functions.

                        Do you have plans?

                        Thanks
                        Stephane

                        Comment


                        • #13
                          ASMDATA will resolve #DEBUG DISPLAY problem.

                          I have had a hiatus from programming until PBCC6 was announced. See Bob Zale's recent post about ASMDATA which resolves the #DEBUG DISPLAY problem. I recently bit the bullet and began programming with objects. I have found them useful in some contexts, especially as UDT's can be returned by METHODs. This allows the returned UDT to then be used as a parameter for another operation without first assigning it to a separate variable. This makes the code much more self-descriptive. (A con of METHOD is that there seems to be no simple way to pass arrays other than passing the address of the descriptor table using VARPTR.)

                          Anyway, I have begun rewriting my code with objects, and that is progressing as time permits. Using higher precision data than Extended can be very slow because I try to be extra careful and not take shortcuts. Speed is not really a worry for me because I use these algorithms to obtain a set of extended precision data for other uses that I can be fairly certain has not had excessive rounding errors. This was the whole reason in developing the extra precision techniques. Maybe I will post these new algorithms at a later date. I will likely use the new algorithms to check my earlier postings on this subject.

                          Comment

                          Working...
                          X