/***************************************************************
__MPU_FLOATP.C
This file contains source code of functions for
REAL constants operations.
PART OF : MPU - library .
USAGE : Internal only .
NOTE : NONE .
Copyright (C) 2000 - 2024 by Andrew V.Kosteltsev.
All Rights Reserved.
***************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <errno.h> /* errno(3) */
#include <string.h> /* strcpy(3) */
#include <strings.h> /* bzero(3) */
#include <libmpu.h>
#include <mpu-context.h>
#include <mpu-emutype.h>
#include <mpu-integer.h>
#include <mpu-real.h>
#include <mpu-floatp.h>
#include <mpu-char.h>
#include <mpu-symbols.h>
#include <mpu-math-errno.h>
#include <mpu-mtherr.h>
#if MPU_WORD_ORDER_BIG_ENDIAN == 0
#include <binexp/lbin_exp_emu32lsb.dfn>
#else
#include <binexp/lbin_exp_emu32msb.dfn>
#endif
#if MPU_WORD_ORDER_BIG_ENDIAN == 0
#include <decexp/ldec_exp_emu32lsb.dfn>
#else
#include <decexp/ldec_exp_emu32msb.dfn>
#endif
#if MPU_WORD_ORDER_BIG_ENDIAN == 0
#include <epsilon/ei_epsilon_emu32lsb.dfn>
#else
#include <epsilon/ei_epsilon_emu32msb.dfn>
#endif
/***************************************************************
LIMITS for DECIMAL Exponent of all
Internal e-type data struct.
SIZE of CONSTANTS == nE+1.
nE = (int)internalNE( nb );
nb - number of bits of external
e-type number.
***************************************************************/
EMUSHORT *_get_maxdecexp_ptr( int nb )
{
EMUSHORT *rc = (EMUSHORT *)NULL;
switch( nb )
{
case NBR_32 :
case NBR_64 :
case NBR_128 :
rc = (EMUSHORT *)&_max_dec_exp_128_[0];
break;
case NBR_256 :
rc = (EMUSHORT *)&_max_dec_exp_256_[0];
break;
case NBR_512 :
rc = (EMUSHORT *)&_max_dec_exp_512_[0];
break;
case NBR_1024 :
rc = (EMUSHORT *)&_max_dec_exp_1024_[0];
break;
case NBR_2048 :
rc = (EMUSHORT *)&_max_dec_exp_2048_[0];
break;
case NBR_4096 :
rc = (EMUSHORT *)&_max_dec_exp_4096_[0];
break;
case NBR_8192 :
rc = (EMUSHORT *)&_max_dec_exp_8192_[0];
break;
case NBR_16384 :
rc = (EMUSHORT *)&_max_dec_exp_16384_[0];
break;
case NBR_32768 :
rc = (EMUSHORT *)&_max_dec_exp_32768_[0];
break;
case NBR_65536 :
rc = (EMUSHORT *)&_max_dec_exp_65536_[0];
break;
case NBR_131072:
rc = (EMUSHORT *)&_max_dec_exp_131072_[0];
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_maxdecexp_ptr() */
EMUSHORT *_get_mindecexp_ptr( int nb )
{
EMUSHORT *rc = (EMUSHORT *)NULL;
switch( nb )
{
case NBR_32 :
case NBR_64 :
case NBR_128 :
rc = (EMUSHORT *)&_min_dec_exp_128_[0];
break;
case NBR_256 :
rc = (EMUSHORT *)&_min_dec_exp_256_[0];
break;
case NBR_512 :
rc = (EMUSHORT *)&_min_dec_exp_512_[0];
break;
case NBR_1024 :
rc = (EMUSHORT *)&_min_dec_exp_1024_[0];
break;
case NBR_2048 :
rc = (EMUSHORT *)&_min_dec_exp_2048_[0];
break;
case NBR_4096 :
rc = (EMUSHORT *)&_min_dec_exp_4096_[0];
break;
case NBR_8192 :
rc = (EMUSHORT *)&_min_dec_exp_8192_[0];
break;
case NBR_16384 :
rc = (EMUSHORT *)&_min_dec_exp_16384_[0];
break;
case NBR_32768 :
rc = (EMUSHORT *)&_min_dec_exp_32768_[0];
break;
case NBR_65536 :
rc = (EMUSHORT *)&_min_dec_exp_65536_[0];
break;
case NBR_131072:
rc = (EMUSHORT *)&_min_dec_exp_131072_[0];
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_mindecexp_ptr() */
EMUSHORT *_get_max_10_exp_ptr( int nb )
{
EMUSHORT *rc = (EMUSHORT *)NULL;
switch( nb )
{
case NBR_32 :
rc = (EMUSHORT *)&_max_dec_exp_32_[0];
break;
case NBR_64 :
rc = (EMUSHORT *)&_max_dec_exp_64_[0];
break;
case NBR_128 :
rc = (EMUSHORT *)&_max_dec_exp_128_[0];
break;
case NBR_256 :
rc = (EMUSHORT *)&_max_dec_exp_256_[0];
break;
case NBR_512 :
rc = (EMUSHORT *)&_max_dec_exp_512_[0];
break;
case NBR_1024 :
rc = (EMUSHORT *)&_max_dec_exp_1024_[0];
break;
case NBR_2048 :
rc = (EMUSHORT *)&_max_dec_exp_2048_[0];
break;
case NBR_4096 :
rc = (EMUSHORT *)&_max_dec_exp_4096_[0];
break;
case NBR_8192 :
rc = (EMUSHORT *)&_max_dec_exp_8192_[0];
break;
case NBR_16384 :
rc = (EMUSHORT *)&_max_dec_exp_16384_[0];
break;
case NBR_32768 :
rc = (EMUSHORT *)&_max_dec_exp_32768_[0];
break;
case NBR_65536 :
rc = (EMUSHORT *)&_max_dec_exp_65536_[0];
break;
case NBR_131072:
rc = (EMUSHORT *)&_max_dec_exp_131072_[0];
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_max_10_exp_ptr() */
EMUSHORT *_get_min_10_exp_ptr( int nb )
{
EMUSHORT *rc = (EMUSHORT *)NULL;
switch( nb )
{
case NBR_32 :
rc = (EMUSHORT *)&_min_dec_exp_32_[0];
break;
case NBR_64 :
rc = (EMUSHORT *)&_min_dec_exp_64_[0];
break;
case NBR_128 :
rc = (EMUSHORT *)&_min_dec_exp_128_[0];
break;
case NBR_256 :
rc = (EMUSHORT *)&_min_dec_exp_256_[0];
break;
case NBR_512 :
rc = (EMUSHORT *)&_min_dec_exp_512_[0];
break;
case NBR_1024 :
rc = (EMUSHORT *)&_min_dec_exp_1024_[0];
break;
case NBR_2048 :
rc = (EMUSHORT *)&_min_dec_exp_2048_[0];
break;
case NBR_4096 :
rc = (EMUSHORT *)&_min_dec_exp_4096_[0];
break;
case NBR_8192 :
rc = (EMUSHORT *)&_min_dec_exp_8192_[0];
break;
case NBR_16384 :
rc = (EMUSHORT *)&_min_dec_exp_16384_[0];
break;
case NBR_32768 :
rc = (EMUSHORT *)&_min_dec_exp_32768_[0];
break;
case NBR_65536 :
rc = (EMUSHORT *)&_min_dec_exp_65536_[0];
break;
case NBR_131072:
rc = (EMUSHORT *)&_min_dec_exp_131072_[0];
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_min_10_exp_ptr() */
/***************************************************************
LIMITS for BINARY Exponent of all
Internal e-type data struct.
SIZE of CONSTANTS == nE+1.
nE = (int)internalNE( nb );
nb - number of bits of external
e-type number.
***************************************************************/
EMUSHORT *_get_max_max_2_exp_ptr( int nb )
{
EMUSHORT *rc = (EMUSHORT *)NULL;
switch( nb )
{
case NBR_32 :
rc = (EMUSHORT *)&_max_max_bin_exp_32_[0];
break;
case NBR_64 :
rc = (EMUSHORT *)&_max_max_bin_exp_64_[0];
break;
case NBR_128 :
rc = (EMUSHORT *)&_max_max_bin_exp_128_[0];
break;
case NBR_256 :
rc = (EMUSHORT *)&_max_max_bin_exp_256_[0];
break;
case NBR_512 :
rc = (EMUSHORT *)&_max_max_bin_exp_512_[0];
break;
case NBR_1024 :
rc = (EMUSHORT *)&_max_max_bin_exp_1024_[0];
break;
case NBR_2048 :
rc = (EMUSHORT *)&_max_max_bin_exp_2048_[0];
break;
case NBR_4096 :
rc = (EMUSHORT *)&_max_max_bin_exp_4096_[0];
break;
case NBR_8192 :
rc = (EMUSHORT *)&_max_max_bin_exp_8192_[0];
break;
case NBR_16384 :
rc = (EMUSHORT *)&_max_max_bin_exp_16384_[0];
break;
case NBR_32768 :
rc = (EMUSHORT *)&_max_max_bin_exp_32768_[0];
break;
case NBR_65536 :
rc = (EMUSHORT *)&_max_max_bin_exp_65536_[0];
break;
case NBR_131072:
rc = (EMUSHORT *)&_max_max_bin_exp_131072_[0];
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_max_max_2_exp_ptr() */
EMUSHORT *_get_max_2_exp_ptr( int nb )
{
EMUSHORT *rc = (EMUSHORT *)NULL;
switch( nb )
{
case NBR_32 :
rc = (EMUSHORT *)&_max_bin_exp_32_[0];
break;
case NBR_64 :
rc = (EMUSHORT *)&_max_bin_exp_64_[0];
break;
case NBR_128 :
rc = (EMUSHORT *)&_max_bin_exp_128_[0];
break;
case NBR_256 :
rc = (EMUSHORT *)&_max_bin_exp_256_[0];
break;
case NBR_512 :
rc = (EMUSHORT *)&_max_bin_exp_512_[0];
break;
case NBR_1024 :
rc = (EMUSHORT *)&_max_bin_exp_1024_[0];
break;
case NBR_2048 :
rc = (EMUSHORT *)&_max_bin_exp_2048_[0];
break;
case NBR_4096 :
rc = (EMUSHORT *)&_max_bin_exp_4096_[0];
break;
case NBR_8192 :
rc = (EMUSHORT *)&_max_bin_exp_8192_[0];
break;
case NBR_16384 :
rc = (EMUSHORT *)&_max_bin_exp_16384_[0];
break;
case NBR_32768 :
rc = (EMUSHORT *)&_max_bin_exp_32768_[0];
break;
case NBR_65536 :
rc = (EMUSHORT *)&_max_bin_exp_65536_[0];
break;
case NBR_131072:
rc = (EMUSHORT *)&_max_bin_exp_131072_[0];
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_max_2_exp_ptr() */
EMUSHORT *_get_min_2_exp_ptr( int nb )
{
EMUSHORT *rc = (EMUSHORT *)NULL;
switch( nb )
{
case NBR_32 :
rc = (EMUSHORT *)&_min_bin_exp_32_[0];
break;
case NBR_64 :
rc = (EMUSHORT *)&_min_bin_exp_64_[0];
break;
case NBR_128 :
rc = (EMUSHORT *)&_min_bin_exp_128_[0];
break;
case NBR_256 :
rc = (EMUSHORT *)&_min_bin_exp_256_[0];
break;
case NBR_512 :
rc = (EMUSHORT *)&_min_bin_exp_512_[0];
break;
case NBR_1024 :
rc = (EMUSHORT *)&_min_bin_exp_1024_[0];
break;
case NBR_2048 :
rc = (EMUSHORT *)&_min_bin_exp_2048_[0];
break;
case NBR_4096 :
rc = (EMUSHORT *)&_min_bin_exp_4096_[0];
break;
case NBR_8192 :
rc = (EMUSHORT *)&_min_bin_exp_8192_[0];
break;
case NBR_16384 :
rc = (EMUSHORT *)&_min_bin_exp_16384_[0];
break;
case NBR_32768 :
rc = (EMUSHORT *)&_min_bin_exp_32768_[0];
break;
case NBR_65536 :
rc = (EMUSHORT *)&_min_bin_exp_65536_[0];
break;
case NBR_131072:
rc = (EMUSHORT *)&_min_bin_exp_131072_[0];
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_min_2_exp_ptr() */
int _get_ndec( int nb )
/*****************************************
Количество десятичных знаков в мантиссе
*****************************************/
{
int rc = 0;
switch( nb )
{
case NBR_32 :
rc = REAL_32_MDEC_DIG;
break;
case NBR_64 :
rc = REAL_64_MDEC_DIG;
break;
case NBR_128 :
rc = REAL_128_MDEC_DIG;
break;
case NBR_256 :
rc = REAL_256_MDEC_DIG;
break;
case NBR_512 :
rc = REAL_512_MDEC_DIG;
break;
case NBR_1024 :
rc = REAL_1024_MDEC_DIG;
break;
case NBR_2048 :
rc = REAL_2048_MDEC_DIG;
break;
case NBR_4096 :
rc = REAL_4096_MDEC_DIG;
break;
case NBR_8192 :
rc = REAL_8192_MDEC_DIG;
break;
case NBR_16384 :
rc = REAL_16384_MDEC_DIG;
break;
case NBR_32768 :
rc = REAL_32768_MDEC_DIG;
break;
case NBR_65536 :
rc = REAL_65536_MDEC_DIG;
break;
case NBR_131072:
rc = REAL_131072_MDEC_DIG;
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_ndec() */
int _get_max_string( int nb )
/***************************************************
Максимальное количество десятичных знаков в числе
***************************************************/
{
int rc = 0;
switch( nb )
{
case NBR_32 :
rc = REAL_32_MAX_STRING;
break;
case NBR_64 :
rc = REAL_64_MAX_STRING;
break;
case NBR_128 :
rc = REAL_128_MAX_STRING;
break;
case NBR_256 :
rc = REAL_256_MAX_STRING;
break;
case NBR_512 :
rc = REAL_512_MAX_STRING;
break;
case NBR_1024 :
rc = REAL_1024_MAX_STRING;
break;
case NBR_2048 :
rc = REAL_2048_MAX_STRING;
break;
case NBR_4096 :
rc = REAL_4096_MAX_STRING;
break;
case NBR_8192 :
rc = REAL_8192_MAX_STRING;
break;
case NBR_16384 :
rc = REAL_16384_MAX_STRING;
break;
case NBR_32768 :
rc = REAL_32768_MAX_STRING;
break;
case NBR_65536 :
rc = REAL_65536_MAX_STRING;
break;
case NBR_131072:
rc = REAL_131072_MAX_STRING;
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_max_string() */
/***************************************************************
EPSILONs for all Internal e-type data struct.
EPSILON is smallest such that 1.0+EPSILON != 1.0.
***************************************************************/
EMUSHORT *_get_epsilon_ptr( int nb )
{
EMUSHORT *rc = (EMUSHORT *)NULL;
switch( nb )
{
case NBR_32 :
rc = (EMUSHORT *)&_ei_epsilon_32_[0];
break;
case NBR_64 :
rc = (EMUSHORT *)&_ei_epsilon_64_[0];
break;
case NBR_128 :
rc = (EMUSHORT *)&_ei_epsilon_128_[0];
break;
case NBR_256 :
rc = (EMUSHORT *)&_ei_epsilon_256_[0];
break;
case NBR_512 :
rc = (EMUSHORT *)&_ei_epsilon_512_[0];
break;
case NBR_1024 :
rc = (EMUSHORT *)&_ei_epsilon_1024_[0];
break;
case NBR_2048 :
rc = (EMUSHORT *)&_ei_epsilon_2048_[0];
break;
case NBR_4096 :
rc = (EMUSHORT *)&_ei_epsilon_4096_[0];
break;
case NBR_8192 :
rc = (EMUSHORT *)&_ei_epsilon_8192_[0];
break;
case NBR_16384 :
rc = (EMUSHORT *)&_ei_epsilon_16384_[0];
break;
case NBR_32768 :
rc = (EMUSHORT *)&_ei_epsilon_32768_[0];
break;
case NBR_65536 :
rc = (EMUSHORT *)&_ei_epsilon_65536_[0];
break;
case NBR_131072:
rc = (EMUSHORT *)&_ei_epsilon_131072_[0];
break;
default:
{
/* error: Invalid size of operand(s) */
__real_error_no = __R_ESIZE__;
__STIND; /* Set REAL ind-produsing operation Flag */
break;
}
} /* End of switch( nb ) */
return( rc );
} /* End of _get_epsilon_ptr() */
/***************************************************************
Hide internal symbols:
***************************************************************/
__mpu_hidden_decl(_get_maxdecexp_ptr);
__mpu_hidden_decl(_get_mindecexp_ptr);
__mpu_hidden_decl(_get_max_10_exp_ptr);
__mpu_hidden_decl(_get_min_10_exp_ptr);
__mpu_hidden_decl(_get_max_max_2_exp_ptr);
__mpu_hidden_decl(_get_max_2_exp_ptr);
__mpu_hidden_decl(_get_min_2_exp_ptr);
__mpu_hidden_decl(_get_ndec);
__mpu_hidden_decl(_get_max_string);
__mpu_hidden_decl(_get_epsilon_ptr);
/*
End of hide internal symbols.
***************************************************************/