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