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, 286 insertions, 0 deletions
diff --git a/mpu/mpu-math-errno.c b/mpu/mpu-math-errno.c
new file mode 100644
index 0000000..f5a7e9e
--- /dev/null
+++ b/mpu/mpu-math-errno.c
@@ -0,0 +1,365 @@
+
+/***************************************************************
+  __MPU_MATH_ERRNO.C
+
+       This file contains source code of functions for
+       MATH ERRNO SUPPRESS 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 <nls.h>
+
+#include <errno.h>
+
+#include <libmpu.h>
+#include <mpu-context.h>
+#include <mpu-symbols.h>
+
+#include <mpu-math-errno.h>
+
+
+#ifndef _ERR_REMAP
+# define _ERR_REMAP(n) n
+#endif
+
+const __mpu_char8_t *const __mpu_integer_errlist[] =
+{
+  /************************************************************
+    Нет ошибки.
+   ************************************************************/
+  /*   0                      */
+  [0] = (__mpu_char8_t *)N_("Success"),
+
+#ifdef __I_ESIZE__
+  /************************************************************
+    Invalid size of operand(s).
+    ==========================================================
+    Недопустимый размер операнда/операндов.
+
+       В типичном случае эта ошибка указывает на то, что
+       при вызове функции целочисленной арифметики был
+       задан нулевой размер операнда.
+   ************************************************************/
+  /*   1 __I_ESIZE__          */
+  [_ERR_REMAP(__I_ESIZE__)] = (__mpu_char8_t *)N_("Invalid size of operand(s)"),
+#endif
+
+#ifdef __I_ESHIFT__
+  /************************************************************
+    Invalid number of shifts.
+    ==========================================================
+    Недопустимое количество сдвигов операнда на один бит.
+
+   ************************************************************/
+  /*   2 __I_ESHIFT__         */
+  [_ERR_REMAP(__I_ESHIFT__)] = (__mpu_char8_t *)N_("Invalid number of shifts"),
+#endif
+
+#ifdef __I_ENUMBER__
+  /************************************************************
+    Invalid number.
+    ==========================================================
+    Недопустимая числовая константа.
+
+       В типичном случае эта ошибка указывает на то, что
+       при вызове функции перевода числовой константы из
+       строкового представления в целое число был обнаружен
+       символ, недопустимый для представления числовых
+       констант.
+   ************************************************************/
+  /*   3 __I_ENUMBER__        */
+  [_ERR_REMAP(__I_ENUMBER__)] = (__mpu_char8_t *)N_("Invalid number"),
+#endif
+
+#ifdef __I_ERADIX__
+  /************************************************************
+    Invalid radix.
+    ==========================================================
+    Недопустимая система счисления.
+
+       В типичном случае эта ошибка указывает на то, что
+       при вызове функции перевода числовой константы из
+       строкового представления в целое число или наоборот
+       была задана недопустимая исходная или целевая система
+       счисления.
+   ************************************************************/
+  /*   4 __I_ERADIX__         */
+  [_ERR_REMAP(__I_ERADIX__)] = (__mpu_char8_t *)N_("Invalid radix"),
+#endif
+
+
+  [_ERR_REMAP(__I_MAX_ERRNO)] = (__mpu_char8_t *)0 /* __TX_MATH_EUNKNOW_MSG */
+
+};
+
+const __mpu_error_t __mpu_integer_nerr = sizeof( __mpu_integer_errlist ) /
+                                         sizeof( __mpu_integer_errlist[0] ) - 1;
+
+
+
+const __mpu_char8_t *const __mpu_real_errlist[] =
+{
+  /************************************************************
+    Нет ошибки.
+   ************************************************************/
+  /*   0                      */
+  [0] = (__mpu_char8_t *)N_("Success"),
+
+#ifdef __R_ESIZE__
+  /************************************************************
+    Invalid size of operand(s).
+    ==========================================================
+    Недопустимый размер операнда/операндов.
+
+       В типичном случае эта ошибка указывает на то, что
+       при вызове функции арифметики вещественных чисел был
+       задан нулевой размер операнда.
+   ************************************************************/
+  /*   1 __R_ESIZE__          */
+  [_ERR_REMAP(__R_ESIZE__)] = (__mpu_char8_t *)N_("Invalid size of operand(s)"),
+#endif
+
+#ifdef __R_ETRUNC__
+  /************************************************************
+    Invalid number of TRUNC bits(BZ).
+    ==========================================================
+    Недопустимое количество отсекаемых бит.
+
+       В типичном случае эта ошибка указывает на то, что
+       при вызове функции арифметики вещественных чисел во
+       время операций нормализации или округления, количество
+       обнуляемых бит оказалось больше чем количество бит
+       мантиссы (см. ei_TRUNC() в math_f.c).
+   ************************************************************/
+  /*   2 __R_ETRUNC__         */
+  [_ERR_REMAP(__R_ETRUNC__)] = (__mpu_char8_t *)N_("Invalid number of TRUNC bits(BZ)"),
+#endif
+
+
+  [_ERR_REMAP(__R_MAX_ERRNO)] = (__mpu_char8_t *)0 /* __TX_MATH_EUNKNOW_MSG */
+
+};
+
+const __mpu_error_t __mpu_real_nerr = sizeof( __mpu_real_errlist ) /
+                                      sizeof( __mpu_real_errlist[0] ) - 1;
+
+
+
+const __mpu_char8_t *const __mpu_complex_errlist[] =
+{
+  /************************************************************
+    Нет ошибки.
+   ************************************************************/
+  /*   0                      */
+  [0] = (__mpu_char8_t *)N_("Success"),
+
+#ifdef __C_EDIVZEROBYZERO__
+  /************************************************************
+    Complex attempted division by zero( Divide ZERO by ZERO).
+    ==========================================================
+    Деление НУЛЯ на НУЛЬ.
+
+       Эта ошибка указывает на то, что при вызове функции
+       арифметики комплексных чисел была попытка разделить
+       НУЛЬ на НУЛЬ.
+   ************************************************************/
+  /*   1 __C_EDIVZEROBYZERO__ */
+  [_ERR_REMAP(__C_EDIVZEROBYZERO__)] = (__mpu_char8_t *)N_("Complex attempted division by zero"),
+#endif
+
+#ifdef __C_ELOGOFZERO__
+  /************************************************************
+    Complex attempted LOG of zero magnitude number.
+    ==========================================================
+    Вычисление логарифма НУЛЯ.
+
+       Эта ошибка указывает на то, что при вызове функции
+       вычисления логарифма комплексного числа был задан
+       операнд, равный НУЛЮ.
+   ************************************************************/
+  /*   2 __C_ELOGOFZERO__     */
+  [_ERR_REMAP(__C_ELOGOFZERO__)] = (__mpu_char8_t *)N_("Complex attempted LOG of zero magnitude number"),
+#endif
+
+#ifdef __C_EPOWOFZERO__
+  /************************************************************
+    Complex attempted POW of zero magnitude number.
+    ==========================================================
+    Возведение в степень НУЛЯ.
+
+       Эта ошибка указывает на то, что при вызове функции
+       возведения комплексного числа в степень был задан
+       операнд, равный НУЛЮ.
+   ************************************************************/
+  /*   3 __C_EPOWOFZERO__     */
+  [_ERR_REMAP(__C_EPOWOFZERO__)] = (__mpu_char8_t *)N_("Complex attempted POW of zero magnitude number"),
+#endif
+
+
+  [_ERR_REMAP(__C_MAX_ERRNO)] = (__mpu_char8_t *)0 /* __TX_MATH_EUNKNOW_MSG */
+
+};
+
+const __mpu_error_t __mpu_complex_nerr = sizeof( __mpu_complex_errlist ) /
+                                         sizeof( __mpu_complex_errlist[0] ) - 1;
+
+
+
+const __mpu_char8_t *const __mpu_math_errlist[] =
+{
+  /************************************************************
+    Нет ошибки.
+   ************************************************************/
+  /*   0                      */
+  [0] = (__mpu_char8_t *)N_("Success"),
+
+#ifdef __DOMAIN__
+  /************************************************************
+    Argument domain error.
+    ==========================================================
+    Math argument (Domain error)
+    (Ошибка в задании параметра математической функции)
+
+       Значение параметра функции из библиотеки математических
+       функций лежит вне области определения этой функции.
+   ************************************************************/
+  /*   1 __DOMAIN__           */
+  [_ERR_REMAP(__DOMAIN__)] = (__mpu_char8_t *)N_("Argument domain"),
+#endif
+
+#ifdef __SING__
+  /************************************************************
+    Argument singularity error.
+    ==========================================================
+
+   ************************************************************/
+  /*   2 __SING__             */
+  [_ERR_REMAP(__SING__)] = (__mpu_char8_t *)N_("Function singularity"),
+#endif
+
+#ifdef __OVERFLOW__
+  /************************************************************
+    Overflow range error.
+    ==========================================================
+
+   ************************************************************/
+  /*   3 __OVERFLOW__         */
+  [_ERR_REMAP(__OVERFLOW__)] = (__mpu_char8_t *)N_("Overflow range"),
+#endif
+
+#ifdef __UNDERFLOW__
+  /************************************************************
+    Underflow range error.
+    ==========================================================
+
+   ************************************************************/
+  /*   4 __UNDERFLOW__        */
+  [_ERR_REMAP(__UNDERFLOW__)] = (__mpu_char8_t *)N_("Underflow range"),
+#endif
+
+#ifdef __TLOSS__
+  /************************************************************
+    Total loss of precision.
+    ==========================================================
+
+   ************************************************************/
+  /*   5 __TLOSS__            */
+  [_ERR_REMAP(__TLOSS__)] = (__mpu_char8_t *)N_("Total loss of precision"),
+#endif
+
+#ifdef __PLOSS__
+  /************************************************************
+    Partial loss of precision.
+    ==========================================================
+
+   ************************************************************/
+  /*   6 __PLOSS__            */
+  [_ERR_REMAP(__PLOSS__)] = (__mpu_char8_t *)N_("Partial loss of precision"),
+#endif
+
+#ifdef __INVALID__
+  /************************************************************
+    -InD - produsing operation.
+    ==========================================================
+
+   ************************************************************/
+  /*   7 __INVALID__          */
+  [_ERR_REMAP(__INVALID__)] = (__mpu_char8_t *)N_("Invalid operation"),
+#endif
+
+#ifdef __INEXACT__
+  /************************************************************
+    Inexact result of operation.
+    ==========================================================
+
+   ************************************************************/
+  /*   8 __INEXACT__          */
+  [_ERR_REMAP(__INEXACT__)] = (__mpu_char8_t *)N_("Inexact result of operation"),
+#endif
+
+
+  [_ERR_REMAP(__M_MAX_ERRNO)] = (__mpu_char8_t *)0 /* __TX_MATH_EUNKNOW_MSG */
+
+};
+
+const __mpu_error_t __mpu_math_nerr = sizeof( __mpu_math_errlist ) /
+                                      sizeof( __mpu_math_errlist[0] ) - 1;
+
+
+/***************************************************************
+  Таблица перевода кодов ошибок математических функций
+  в системные коды ошибок.
+
+     Код __EUNKNOWN__ в нашем случае равен НУЛЮ. Это сделано
+     для того, чтобы __EUNKNOWN__-вхождения в таблицу
+     __mpu_math_errnotab[] возвращали НУЛЬ - то есть код,
+     который говорит об отсутствии ошибок. Таким образом
+     перевод кода __EUNKNOWN__ в системный код ошибки дает
+     нулевой результат( отсутствие системной ошибки ).
+ ***************************************************************/
+int __mpu_math_errnotab[] =
+{
+  /*
+    syserror value <== matherror value
+   ************************************/
+  __EUNKNOWN__,     /* Success        */
+  EDOM,             /* __DOMAIN__     */
+  EDOM,             /* __SING__       */
+  ERANGE,           /* __OVERFLOW__   */
+  ERANGE,           /* __UNDERFLOW__  */
+  ERANGE,           /* __TLOSS__      */
+  ERANGE,           /* __PLOSS__      */
+  EDOM,             /* __INVALID__    */
+  ERANGE,           /* __INEXACT__    */
+  __EUNKNOWN__      /* __M_MAX_ERRNO  */
+};
+
+
+/***************************************************************
+  Hide internal symbols:
+ ***************************************************************/
+__mpu_hidden_decl(__mpu_integer_errlist);
+__mpu_hidden_decl(__mpu_integer_nerr);
+__mpu_hidden_decl(__mpu_real_errlist);
+__mpu_hidden_decl(__mpu_real_nerr);
+__mpu_hidden_decl(__mpu_complex_errlist);
+__mpu_hidden_decl(__mpu_complex_nerr);
+__mpu_hidden_decl(__mpu_math_errlist);
+__mpu_hidden_decl(__mpu_math_nerr);
+
+__mpu_hidden_decl(__mpu_math_errnotab);
+/*
+  End of hide internal symbols.
+ ***************************************************************/