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 */