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
author: kx <kx@radix-linux.su> 2024-12-20 16:11:07 +0300 committer: kx <kx@radix-linux.su> 2024-12-20 16:11:07 +0300 commit: 868b2b66b564b5c00e3a74d10be45db7151627ac parent: cce2ae8d3312493b7653358bb4af201d3271377b
Commit Summary:
Version 1.0.14
Diffstat:
1 file changed, 127 insertions, 0 deletions
diff --git a/mpu/mpu-floatp.h b/mpu/mpu-floatp.h
new file mode 100644
index 0000000..c0945d1
--- /dev/null
+++ b/mpu/mpu-floatp.h
@@ -0,0 +1,165 @@
+
+/***************************************************************
+  __MPU_FLOATP.H
+
+       This file contains declarations of functions for
+       REAL constants operations.
+
+       PART OF : MPU - library .
+
+       USAGE   : Internal only .
+
+       NOTE    : Include "libmpu.h" before this FILE .
+
+       Copyright (C) 2000 - 2024  by Andrew V.Kosteltsev.
+       All Rights Reserved.
+ ***************************************************************/
+
+#ifndef   __MPU_FLOATP_H
+#define   __MPU_FLOATP_H
+
+
+/***************************************************************
+  Количество десятичных знаков в мантиссе:
+ ***************************************************************/
+#define REAL_32_MDEC_DIG           6  /*     6.924 =     23*log10(2.) */
+#define REAL_64_MDEC_DIG          15  /*    15.654 =     52*log10(2.) */
+#define REAL_128_MDEC_DIG         28  /*    28.899 =     96*log10(2.) */
+#define REAL_256_MDEC_DIG         67  /*    67.431 =    224*log10(2.) */
+
+#define REAL_512_MDEC_DIG        134  /*   134.861 =    448*log10(2.) */
+#define REAL_1024_MDEC_DIG       288  /*   288.989 =    960*log10(2.) */
+
+#define REAL_2048_MDEC_DIG       577  /*   577.978 =   1920*log10(2.) */
+#define REAL_4096_MDEC_DIG      1194  /*  1194.487 =   3968*log10(2.) */
+
+#define REAL_8192_MDEC_DIG      2388  /*  2388.974 =   7936*log10(2.) */
+#define REAL_16384_MDEC_DIG     4855  /*  4855.012 =  16128*log10(2.) */
+
+#define REAL_32768_MDEC_DIG     9710  /*  9710.024 =  32256*log10(2.) */
+#define REAL_65536_MDEC_DIG    19574  /* 19574.174 =  65024*log10(2.) */
+
+#define REAL_131072_MDEC_DIG   39148  /* 39148.349 = 130048*log10(2.) */
+
+/***************************************************************
+  Максимальные размеры строк даны с запасом, в действительности
+  они вычисляются как сумма макс.размер мантиссы + макс.размер
+  экспоненты + знак + знак экспоненты + [суффикс, например,
+  r256].
+ ***************************************************************/
+#define REAL_32_MAX_STRING          20
+#define REAL_64_MAX_STRING          40
+#define REAL_128_MAX_STRING         60
+#define REAL_256_MAX_STRING         80
+
+#define REAL_512_MAX_STRING        160
+#define REAL_1024_MAX_STRING       320
+
+#define REAL_2048_MAX_STRING       640
+#define REAL_4096_MAX_STRING      1280
+
+#define REAL_8192_MAX_STRING      2560
+#define REAL_16384_MAX_STRING     5120
+
+#define REAL_32768_MAX_STRING    10240
+#define REAL_65536_MAX_STRING    20480
+
+#define REAL_131072_MAX_STRING   40960
+
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+
+/***************************************************************
+  Следующие функции возвращают указатели на статические массивы
+  содержащие числа размером nE+1 порций EMUSHORT.
+  Числа равны, соответственно,
+     - максимальной десятичной экспоненте вещественного числа
+       размером nb-бит (REAL_xxxxxx_MAX_DEC_EXP)
+     - и минимальной десятичной экспоненте вещественного числа
+       размером nb-бит (REAL_xxxxxx_MIN_DEC_EXP).
+      [see: float.h: DBL_MAX_10_EXP, DBL_MIN_10_EXP.]
+
+  nE можно вычислить следующим образом: 
+     int nE = (int)internal_ne( nb ); => see mpu-real.h
+
+  NOTE: 32 и 64 работают правильно!!!; т.е.:
+        REAL_32_MAX_10_EXP =  38,
+        REAL_32_MIN_10_EXP = -37,
+        REAL_64_MAX_10_EXP =  308,
+        REAL_64_MAX_10_EXP = -307.
+ ***************************************************************/
+extern EMUSHORT *_get_max_10_exp_ptr    ( int nb );
+extern EMUSHORT *_get_min_10_exp_ptr    ( int nb );
+
+/*
+  СЛУЖЕБНЫЕ для MPU-IOREAL.C
+  В ОТЛИЧИЕ ОТ ПРЕДЫДУЩИХ: для 32 и 64 работают иначе;
+  т.е.:
+        REAL_32_MAX_10_EXP =  REAL_128_MAX_10_EXP,
+        REAL_32_MIN_10_EXP =  REAL_128_MAX_10_EXP,
+        REAL_64_MAX_10_EXP =  REAL_128_MAX_10_EXP,
+        REAL_64_MAX_10_EXP =  REAL_128_MAX_10_EXP.
+ ***************************************************************/
+extern EMUSHORT *_get_maxdecexp_ptr     ( int nb );
+extern EMUSHORT *_get_mindecexp_ptr     ( int nb );
+
+/***************************************************************
+  Следующие функции возвращают указатели на статические массивы
+  содержащие числа размером nE+1 порций EMUSHORT.
+  Числа равны, соответственно,
+     - МАКСИМАЛЬНОЙ двоичной экспоненте вещественного числа
+       размером nb-бит (REAL_xxxxxx_MAX_MAX_BIN_EXP),
+     - максимальной двоичной экспоненте вещественного числа
+       размером nb-бит (REAL_xxxxxx_MAX_BIN_EXP),
+     - и минимальной двоичной экспоненте вещественного числа
+       размером nb-бит (REAL_xxxxxx_MIN_BIN_EXP).
+  [
+     REAL_MAX_MAX_BIN_EXP,
+     REAL_MAX_BIN_EXP,
+     REAL_MIN_BIN_EXP
+  ]
+  [see: float.h: DBL_MAX_EXP, DBL_MIN_EXP.]
+
+  nE можно вычислить следующим образом: 
+     int nE = (int)internal_ne( nb ); => see mpu-real.h
+
+  NOTE: 32 и 64 работают правильно!!!; т.е.:
+        REAL_32_MAX_MAX_BIN_EXP =   128,
+        REAL_32_MAX_BIN_EXP     =  +127,
+        REAL_32_MIN_BIN_EXP     =  -126,
+        REAL_64_MAX_MAX_BIN_EXP =  1024,
+        REAL_64_MAX_BIN_EXP     = +1023,
+        REAL_64_MAX_BIN_EXP     = -1022.
+ ***************************************************************/
+extern EMUSHORT *_get_max_max_2_exp_ptr ( int nb );
+extern EMUSHORT *_get_max_2_exp_ptr     ( int nb );
+extern EMUSHORT *_get_min_2_exp_ptr     ( int nb );
+
+/***************************************************************
+  Количество десятичных знаков в мантиссе.
+ ***************************************************************/
+extern int _get_ndec                    ( int nb );
+
+/***************************************************************
+   Максимальное количество десятичных знаков в числе
+   [с запасом].
+ ***************************************************************/
+extern int _get_max_string              ( int nb );
+
+
+/***************************************************************
+  Возвращает указатель на EPSILON во внутреннем формате.
+  EPSILON is smallest such that 1.0+EPSILON != 1.0.
+ ***************************************************************/
+extern EMUSHORT *_get_epsilon_ptr       ( int nb );
+
+
+
+#ifdef  __cplusplus
+}   /* ... extern "C" */
+#endif
+
+#endif /* __MPU_FLOATP_H */