Math Processor Unit Library

libmpu – library of arithmetic functions for integer, real, and complex numbers of increased digit capacity

16 Commits   0 Branches   2 Tags
868b2b66 (kx 2024-12-20 16:11:07 +0300   1) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   2) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   3)   __MPU_REAL.H
868b2b66 (kx 2024-12-20 16:11:07 +0300   4) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   5)        This file contains declarations of functions for
868b2b66 (kx 2024-12-20 16:11:07 +0300   6)        REAL arithmetic operations.
868b2b66 (kx 2024-12-20 16:11:07 +0300   7) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   8)        PART OF : MPU - library .
868b2b66 (kx 2024-12-20 16:11:07 +0300   9) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  10)        USAGE   : Internal only .
868b2b66 (kx 2024-12-20 16:11:07 +0300  11) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  12)        NOTE    : Include "libmpu.h" before this FILE .
868b2b66 (kx 2024-12-20 16:11:07 +0300  13) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  14)        Copyright (C) 2000 - 2024  by Andrew V.Kosteltsev.
868b2b66 (kx 2024-12-20 16:11:07 +0300  15)        All Rights Reserved.
868b2b66 (kx 2024-12-20 16:11:07 +0300  16)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  17) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  18) #ifndef   __MPU_REAL_H
868b2b66 (kx 2024-12-20 16:11:07 +0300  19) #define   __MPU_REAL_H
868b2b66 (kx 2024-12-20 16:11:07 +0300  20) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  21) #ifdef  __cplusplus
868b2b66 (kx 2024-12-20 16:11:07 +0300  22) extern "C" {
868b2b66 (kx 2024-12-20 16:11:07 +0300  23) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  24) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  25) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  26) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  27) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  28)   Internal exploded e-type data structure of a real number
868b2b66 (kx 2024-12-20 16:11:07 +0300  29)   (a EMUSHORT is BITS_PER_EMUSHORT bits):
868b2b66 (kx 2024-12-20 16:11:07 +0300  30) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  31)   EMUSHORT ei[NP];
868b2b66 (kx 2024-12-20 16:11:07 +0300  32) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  33)   IF MPU_WORD_ORDER_BIG_ENDIAN = 1 (m68k, PowerPC)
868b2b66 (kx 2024-12-20 16:11:07 +0300  34) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  35)      ei[0]    - high EMUSHORT partion,
868b2b66 (kx 2024-12-20 16:11:07 +0300  36)      ei[NP-1] - low  EMUSHORT partion.
868b2b66 (kx 2024-12-20 16:11:07 +0300  37) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  38)      - that is ---------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300  39)         pointer -> [high EMUSHORT partion] :0    part
868b2b66 (kx 2024-12-20 16:11:07 +0300  40)                    [        . . .        ] :1    part
868b2b66 (kx 2024-12-20 16:11:07 +0300  41)                               .
868b2b66 (kx 2024-12-20 16:11:07 +0300  42)                               .
868b2b66 (kx 2024-12-20 16:11:07 +0300  43)                               .
868b2b66 (kx 2024-12-20 16:11:07 +0300  44)                    [low  EMUSHORT partion] :NP-1 part
868b2b66 (kx 2024-12-20 16:11:07 +0300  45)      -------------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300  46) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  47)   ELSE IF MPU_WORD_ORDER_BIG_ENDIAN = 0 (i386, Alpha)
868b2b66 (kx 2024-12-20 16:11:07 +0300  48) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  49)      ei[0]    - low  EMUSHORT partion.
868b2b66 (kx 2024-12-20 16:11:07 +0300  50)      ei[NP-1] - high EMUSHORT partion,
868b2b66 (kx 2024-12-20 16:11:07 +0300  51) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  52)      - that is ---------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300  53)        part    0:  [low  EMUSHORT partion] <- pointer
868b2b66 (kx 2024-12-20 16:11:07 +0300  54)        part    1:  [        . . .        ]
868b2b66 (kx 2024-12-20 16:11:07 +0300  55)                               .
868b2b66 (kx 2024-12-20 16:11:07 +0300  56)                               .
868b2b66 (kx 2024-12-20 16:11:07 +0300  57)                               .
868b2b66 (kx 2024-12-20 16:11:07 +0300  58)        part NP-1:  [high EMUSHORT partion]
868b2b66 (kx 2024-12-20 16:11:07 +0300  59)      -------------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300  60) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  61)  ===============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300  62) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  63)   index:
868b2b66 (kx 2024-12-20 16:11:07 +0300  64)   MPU_WORD_ORDER_BIG_ENDIAN = 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  65)  [nS+nE+2]|[nS+nE+1]...[nS+2]| [nS+1]|[nS],   . . . ,   [1]|     [0].
868b2b66 (kx 2024-12-20 16:11:07 +0300  66)   MPU_WORD_ORDER_BIG_ENDIAN = 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  67)        [0]|[1],  . . . , [nE]| [nE+1]|[nE+2], ...,[nE+nS+1]|[nE+nS+2].
868b2b66 (kx 2024-12-20 16:11:07 +0300  68)  |--------|------. . .-------|-------|---------. . .-------|---------|
868b2b66 (kx 2024-12-20 16:11:07 +0300  69)  |  sign  |     Exponent     |  hgw  |      Significand    |   lgw   |
868b2b66 (kx 2024-12-20 16:11:07 +0300  70)  |--------|------. . .-------|-------|---------. . .-------|---------|
868b2b66 (kx 2024-12-20 16:11:07 +0300  71)   size:  1                nE       1                     nS         1
868b2b66 (kx 2024-12-20 16:11:07 +0300  72) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  73)   hgw         - hight guard word (always zero after normalization);
868b2b66 (kx 2024-12-20 16:11:07 +0300  74)   lgw         - low   guard word (0x8000... bit is rounding place);
868b2b66 (kx 2024-12-20 16:11:07 +0300  75)   sign        - знак числа ( '+' - 0x0000...; '-' - 0xffff... );
868b2b66 (kx 2024-12-20 16:11:07 +0300  76)   Exponent    - смещенный порядок;
868b2b66 (kx 2024-12-20 16:11:07 +0300  77)   Significand - мантисса;
868b2b66 (kx 2024-12-20 16:11:07 +0300  78) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  79)   Общее количество слов - nE + nS + 3;
868b2b66 (kx 2024-12-20 16:11:07 +0300  80)   Бит целой (1.) - явный.
868b2b66 (kx 2024-12-20 16:11:07 +0300  81) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  82)   СТАРШИЙ БИТ ЭКСПОНЕНТЫ НЕ ИСПОЛЬЗУЕТСЯ.
868b2b66 (kx 2024-12-20 16:11:07 +0300  83)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  84) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  85) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  86)   NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  87)      Количество порций вещественного числа во внутреннем
868b2b66 (kx 2024-12-20 16:11:07 +0300  88)      формате не должно превышать  максимального значения
868b2b66 (kx 2024-12-20 16:11:07 +0300  89)      EMUSHORT (unsigned int), которому соответствует тип
868b2b66 (kx 2024-12-20 16:11:07 +0300  90)      __mpu_uint32_t.
868b2b66 (kx 2024-12-20 16:11:07 +0300  91)   NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  92)      Это ограничение связано с ограничением количества
868b2b66 (kx 2024-12-20 16:11:07 +0300  93)      бит мантиссы вещественного числа во внутреннем формате.
868b2b66 (kx 2024-12-20 16:11:07 +0300  94)      SEE: ei_normalize() in this file.
868b2b66 (kx 2024-12-20 16:11:07 +0300  95)   NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  96)      В случае программных моделей ILP32, LP64, LLP64 мы
868b2b66 (kx 2024-12-20 16:11:07 +0300  97)      всегда можем иметь 32-битный EMUSHORT, что позволяет
868b2b66 (kx 2024-12-20 16:11:07 +0300  98)      в качестве возвращаемого значения функции ei_normalize()
868b2b66 (kx 2024-12-20 16:11:07 +0300  99)      использовать переменные типа __mpu_int32_t или int.
868b2b66 (kx 2024-12-20 16:11:07 +0300 100)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 102) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 104)   External exploded e-type data structure of a real number
868b2b66 (kx 2024-12-20 16:11:07 +0300 105)   (a EMUPART is BITS_PER_EMUPART bits):
868b2b66 (kx 2024-12-20 16:11:07 +0300 106) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 107)  ===============================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 108) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 109)   index:
868b2b66 (kx 2024-12-20 16:11:07 +0300 110)   MPU_WORD_ORDER_BIG_ENDIAN = 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 111)  [nPx-1], . . . ,[nSx]| [nSx-1],          . . .,                [0].
868b2b66 (kx 2024-12-20 16:11:07 +0300 112)   MPU_WORD_ORDER_BIG_ENDIAN = 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 113)   [0], . . . , [nEx-1]| [nEx],            . . .,            [nPx-1].
868b2b66 (kx 2024-12-20 16:11:07 +0300 114)  |--------. . .-------|-------------------. . .--------------------|
868b2b66 (kx 2024-12-20 16:11:07 +0300 115)  |       Exponent     |                Significand                 |
868b2b66 (kx 2024-12-20 16:11:07 +0300 116)  |--------. . .-------|-------------------. . .--------------------|
868b2b66 (kx 2024-12-20 16:11:07 +0300 117)   ^Sign bit           ^(1.- implicit)
868b2b66 (kx 2024-12-20 16:11:07 +0300 118)   size:            nEx                                          nSx.
868b2b66 (kx 2024-12-20 16:11:07 +0300 119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 120)   Exponent    - смещенный порядок;
868b2b66 (kx 2024-12-20 16:11:07 +0300 121)   Significand - мантисса;
868b2b66 (kx 2024-12-20 16:11:07 +0300 122) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 123)   Общее количество слов - nEx + nSx;
868b2b66 (kx 2024-12-20 16:11:07 +0300 124)   Бит целой (1.) - неявный.
868b2b66 (kx 2024-12-20 16:11:07 +0300 125)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 126) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 127) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 128) /* Следующее не верно для real32 & real64 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 130)   Количество бит выделяемое на Sign и Exponent в
868b2b66 (kx 2024-12-20 16:11:07 +0300 131)   external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 132)   n - number of bits in external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 133)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 134) #define NEBITS(nb) ((__mpu_int32_t)(internal_ne(nb)*BITS_PER_EMUSHORT))
868b2b66 (kx 2024-12-20 16:11:07 +0300 135) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 136)   Количество бит выделяемое на Significand в
868b2b66 (kx 2024-12-20 16:11:07 +0300 137)   external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 138)   n - number of bits in external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 139)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 140) #define NSBITS(nb) ((__mpu_int32_t)(internal_ns(nb)*BITS_PER_EMUSHORT))
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 142) /***********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 143)   Количество EMUSHORT порций в Internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 144)   NOTE for real128 и более:
868b2b66 (kx 2024-12-20 16:11:07 +0300 145)      InternalNP = InternalNE + InternalNS + 3(Sign, hgw, lgw).
868b2b66 (kx 2024-12-20 16:11:07 +0300 146)      ExternalNE = InternalNE.
868b2b66 (kx 2024-12-20 16:11:07 +0300 147)      ExternalNS = InternalNS.
868b2b66 (kx 2024-12-20 16:11:07 +0300 148)      ExternalNP = InternalNE + InternalNS.
868b2b66 (kx 2024-12-20 16:11:07 +0300 149)  ***********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 150) extern int internal_ne( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 151) extern int internal_ns( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 152) extern int internal_np( int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 153) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 154) extern void ei_cleaz     ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 155) extern void ei_cleazs    ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 156) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 157) extern void ei_ind       ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 158) extern int  ei_isind     ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 159) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 160) extern void e_ind        ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 161) extern int  e_isind      ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 162) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 163) extern void ei_nan       ( EMUSHORT *ei, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 164) extern int  ei_isnans    ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 165) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 166) extern void e_nan        ( EMUSHORT *ee, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 167) extern int  e_isnans     ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 168) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 169) extern void ei_nanmax    ( EMUSHORT *ei, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 170) extern int  ei_isnanmax  ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 171) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 172) extern void e_nanmax     ( EMUSHORT *ee, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 173) extern int  e_isnanmax   ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 174) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 175) extern void ei_nanmin    ( EMUSHORT *ei, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 176) extern int  ei_isnanmin  ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 177) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 178) extern void e_nanmin     ( EMUSHORT *ee, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 179) extern int  e_isnanmin   ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 180) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 181) extern void ei_infin     ( EMUSHORT *ei, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 182) extern int  ei_isinfin   ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 183) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 184) extern void e_infin      ( EMUSHORT *ee, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 185) extern int  e_isinfin    ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 186) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 187) extern void e_realmin    ( EMUSHORT *ee, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 188) extern void e_realmax    ( EMUSHORT *ee, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 189) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 190) extern void ei_signull   ( EMUSHORT *ei, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 191) extern int  ei_issignull ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 192) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 193) extern void e_signull    ( EMUSHORT *ee, unsigned sign, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 194) extern int  e_issignull  ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 195) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 196) extern void ei_neg       ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 197) extern int  ei_isneg     ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 198) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 199) extern void e_neg        ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 200) extern int  e_isneg      ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 201) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 202) extern void ei_abs       ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 203) extern void e_abs        ( EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 204) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 205) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 206) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 207)   Functions for LONG INTEGER NUMBERS:
868b2b66 (kx 2024-12-20 16:11:07 +0300 208)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300 209) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 210)   SIGNED COMPARE TWO SIGNED INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300 211)   if( a  > b ) return(  1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 212)   if( a == b ) return(  0);
868b2b66 (kx 2024-12-20 16:11:07 +0300 213)   if( a  < b ) return( -1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 214)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300 215) extern int  ei_cmpe        ( EMUSHORT *a, EMUSHORT *b, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 216) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 217)   SIGNED COMPARE A with ZERO
868b2b66 (kx 2024-12-20 16:11:07 +0300 218)   if( a  > 0 ) return(  1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 219)   if( a == 0 ) return(  0);
868b2b66 (kx 2024-12-20 16:11:07 +0300 220)   if( a  < 0 ) return( -1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 221)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300 222) extern int  ei_cmp0e       ( EMUSHORT *a, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 223) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 224) /* КОПИРОВАНИЕ БОЛЬШЕГО В МЕНЬШЕЕ (npa < npb) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 225) extern void ei_cpye_pack   ( EMUSHORT *a, EMUSHORT *b, int npa, int npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 226) /* КОПИРОВАНИЕ МЕНЬШЕГО В БОЛЬШЕЕ (npa >= npb) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 227) extern void ei_cpye_unpack ( EMUSHORT *a, EMUSHORT *b, int npa, int npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 228) /* COPY UNSIGNED INTEGER NUMBER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 229) extern void ei_cpye        ( EMUSHORT *a, EMUSHORT *b, int npa, int npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 230) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 231) /* КОНВЕРТИРОВАНИЕ МЕНЬШЕГО В БОЛЬШЕЕ (npa >= npb) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 232) extern void ei_cvte_unpack ( EMUSHORT *a, EMUSHORT *b, int npa, int npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 233) /* КОНВЕРТИРОВАНИЕ БОЛЬШЕГО В МЕНЬШЕЕ (npa  < npb) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 234) extern void ei_cvte_pack   ( EMUSHORT *a, EMUSHORT *b, int npa, int npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 235) /* CONVERT SIGNED INTEGER NUMBER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 236) extern void ei_cvte        ( EMUSHORT *a, EMUSHORT *b, int npa, int npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 237) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 238) /* ADD INTEGER NUMBER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 239) extern void ei_adde        ( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 240) /* INCrement INTEGER NUMBER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 241) extern void ei_ince        ( EMUSHORT *c, EMUSHORT *a, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 242) /* SUB INTEGER NUMBER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 243) extern void ei_sube        ( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 244) /* DECrement INTEGER NUMBER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 245) extern void ei_dece        ( EMUSHORT *c, EMUSHORT *a, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 246) /* NEGATE Signed INTEGER NUMBER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 247) extern void ei_nege        ( EMUSHORT *c, EMUSHORT *a, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 248) /* ADD INTEGER NUMBER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 249) extern void ei_ande        ( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 250) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 251) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 252)   СДВИГИ на b bits
868b2b66 (kx 2024-12-20 16:11:07 +0300 253)  ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 254) /* SHIFT RIGHT */
868b2b66 (kx 2024-12-20 16:11:07 +0300 255) extern void ei_shrn        ( EMUSHORT *c, EMUSHORT *a, unsigned b, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 256) /* SHIFT LEFT */
868b2b66 (kx 2024-12-20 16:11:07 +0300 257) extern void ei_shln        ( EMUSHORT *c, EMUSHORT *a, unsigned b, int np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 258) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 259) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 260)   End of Functions for LONG INTEGER NUMBERS.
868b2b66 (kx 2024-12-20 16:11:07 +0300 261)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 262) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 263) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 264) extern void ei_shdown      ( EMUSHORT *ei, unsigned sc, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 265) extern void ei_shup        ( EMUSHORT *ei, unsigned sc, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 266) extern int  ei_shift       ( EMUSHORT *ei, int sc, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 267) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 268) extern __mpu_int32_t
868b2b66 (kx 2024-12-20 16:11:07 +0300 269)             ei_normalize   ( EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 270) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 271) extern void unpack         ( EMUSHORT *ei, EMUSHORT *ee, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 272) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 273) extern int  ei_cmpm        ( EMUSHORT *ai, EMUSHORT *bi, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 274) extern void ei_addm        ( EMUSHORT *ci, EMUSHORT *ai, EMUSHORT *bi, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 275) extern void ei_subm        ( EMUSHORT *ci, EMUSHORT *ai, EMUSHORT *bi, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 276) extern int  ei_divm        ( EMUSHORT *quoti, EMUSHORT *numi, EMUSHORT *deni, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 277) extern int  ei_mulm        ( EMUSHORT *prodi, EMUSHORT *numi, EMUSHORT *muli, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 278) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 279) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 280)   ROUNDOFF parameter register control.
868b2b66 (kx 2024-12-20 16:11:07 +0300 281)   =  ==    =         =        =
868b2b66 (kx 2024-12-20 16:11:07 +0300 282)   регистр управления параметрами ОКРУГЛЕНИЯ.
868b2b66 (kx 2024-12-20 16:11:07 +0300 283)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 284) #define NSBITS_DEFAULT   96 /* = NSBITS( NBR_128 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 285) extern int rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 286) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 287) extern void ei_mdenorm     ( EMUSHORT *si, int lost, int subflag, EMUSHORT *exp, int rcontrol, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 288) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 289) extern void pack           ( EMUSHORT *ee, EMUSHORT *ei, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 290) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 291) extern void ei_copy        ( EMUSHORT *eia, EMUSHORT *eib, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 292) extern void ei_copyzlgw    ( EMUSHORT *eia, EMUSHORT *eib, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 293) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 294) extern int  ei_cmp         ( EMUSHORT *ai, EMUSHORT *bi, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 295) extern void ei_convert     ( EMUSHORT *eia, EMUSHORT *eib, int nba, int nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 296) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 297) extern void ei_add         ( EMUSHORT *eic, EMUSHORT *eia, EMUSHORT *eib, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 298) extern void ei_sub         ( EMUSHORT *eic, EMUSHORT *eia, EMUSHORT *eib, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 299) extern void ei_div         ( EMUSHORT *eic, EMUSHORT *eia, EMUSHORT *eib, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 300) extern void ei_mul         ( EMUSHORT *eic, EMUSHORT *eia, EMUSHORT *eib, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 301) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 302) extern void ei_ltor        ( EMUSHORT *ei, EMUSHORT *lp, int nb, int nlp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 303) extern void ei_ultor       ( EMUSHORT *ei, EMUSHORT *lp, int nb, int nlp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 304) extern void ei_rtoul_frac  ( EMUSHORT *lp, EMUSHORT *frac, EMUSHORT *ei, int nlp, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 305) extern void ei_rtol_frac   ( EMUSHORT *lp, EMUSHORT *frac, EMUSHORT *ei, int nlp, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 306) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 307) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 308)   GENERATORS OF CONSTANT:
868b2b66 (kx 2024-12-20 16:11:07 +0300 309)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300 310) extern void _gen_zero      ( EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 311) extern void _gen_half      ( EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 312) extern void _gen_one       ( EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 313) extern void _gen_two       ( EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 314) extern void _gen_ten       ( EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 315) extern void _gen_mten      ( EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 316) extern void _gen_32        ( EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 317) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 318)   END GENERATORS OF CONSTANT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 319)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 320) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 321) extern void ei_remain      ( EMUSHORT *eic, EMUSHORT *eiquot, EMUSHORT *eia, EMUSHORT *eib, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 322) extern void ei_floor       ( EMUSHORT *eic, EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 323) extern void ei_ceil        ( EMUSHORT *eic, EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 324) extern void ei_round       ( EMUSHORT *eic, EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 325) extern void ei_frexp       ( EMUSHORT *eis, EMUSHORT *lpexp, EMUSHORT *eia, int nlp, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 326) extern void ei_ldexp       ( EMUSHORT *eic, EMUSHORT *lppwr2, EMUSHORT *eia, int nlp, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 327) extern void ei_logb        ( EMUSHORT *lpbase2, EMUSHORT *eia, int nlp, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 328) extern void ei_sqrt        ( EMUSHORT *eic, EMUSHORT *eia, int nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 329) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 330) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 331) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 332) #ifdef  __cplusplus
868b2b66 (kx 2024-12-20 16:11:07 +0300 333) }   /* ... extern "C" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 334) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 335) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 336) #endif /* __MPU_REAL_H */