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