summaryrefslogtreecommitdiff
path: root/include/libmpu.h.in
blob: 9a8d59f7b93e68e11f737080a8b46682369ad4f3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
#ifndef   __LIB_MPU_H
#define   __LIB_MPU_H

#ifdef  __cplusplus
extern "C" {
#endif

#define MPU_REAL_IO_LIMIT            @LIBMPU_REAL_IO_LIMIT@
#define MPU_MATH_FN_LIMIT            @LIBMPU_REAL_MATH_F_LIMIT@

#define MPU_BYTE_ORDER               @GCC_BYTE_ORDER@
#define MPU_BYTE_ORDER_BIG_ENDIAN    @GCC_BYTE_ORDER_BIG_ENDIAN@
#define MPU_BYTE_ORDER_LITTLE_ENDIAN @GCC_BYTE_ORDER_LITTLE_ENDIAN@

#define MPU_WORD_ORDER               @GCC_FLOAT_WORD_ORDER@
#define MPU_WORD_ORDER_BIG_ENDIAN    @GCC_FLOAT_WORD_ORDER_BIG_ENDIAN@
#define MPU_WORD_ORDER_LITTLE_ENDIAN @GCC_FLOAT_WORD_ORDER_LITTLE_ENDIAN@

#define BITS_PER_MACHINE_REGISTER    @MACHINE_REGISTER_WIDTH@

/******************************************
  Minimal addressible UNIT of information:
 */
typedef @GCC_UINT8_TYPE@  __mpu_UNIT_t; /* unsigned UNIT */
typedef @GCC_INT8_TYPE@  __mpu_SUNIT_t; /* signed UNIT */
#define BITS_PER_UNIT_T  @GCC_CHAR_WIDTH@

typedef @GCC_UINT8_TYPE@  __mpu_byte_t; /* unsigned byte */
typedef @GCC_INT8_TYPE@  __mpu_sbyte_t; /* signed byte */
#define BITS_PER_BYTE_T  @GCC_CHAR_WIDTH@

/**********
  ADDRESS:
 */
typedef @GCC_UINTPTR_TYPE@  __mpu_address_t; /* unsigned ADDRESS */
typedef @GCC_UINTPTR_TYPE@  __mpu_saddress_t; /* signed DIFFADDRESS */

/*******************************
  Signed DIFFerence of two PTR:
 */
typedef @GCC_PTRDIFF_TYPE@  __mpu_ptrdiff_t; /* signed PTRDIFF */

/*************
  SIZE types:
 */
typedef @GCC_SIZE_TYPE@  __mpu_size_t; /* unsigned SIZE */
typedef @GCC_INTMAX_TYPE@  __mpu_ssize_t; /* signed SIZE: is type of a byte count, or error. */

/*****************************
  COUNTER is always unsigned:
 */
typedef __mpu_size_t  __mpu_count_t;


/***************************
  ERRNO is always signed:
 */
typedef int __mpu_error_t;


/*******
  VOID:
 */
#define __mpu_void_t  void


#define __mpu_UINT32_C(c) c ## @LIBMPU_UINT32_CONST_SUFFIX@
#define __mpu_UINT64_C(c) c ## @LIBMPU_UINT64_CONST_SUFFIX@


/***************************************************************
  Тип данных, используемый для операций с выровненной памятью.
  Беззнаковый( 32 bits ).
 ***************************************************************/
#define __mem_op_t      @GCC_UINT32_TYPE@
#define MEM_OP_SIZE     (sizeof(__mem_op_t))
#define MEM_OP_BYTES    4
#define MEM_OP_BITS    32

/*********************************
  Base data types:
 */
typedef @GCC_INT8_TYPE@  __mpu_int8_t;
typedef @GCC_UINT8_TYPE@  __mpu_uint8_t;
typedef @GCC_INT16_TYPE@  __mpu_int16_t;
typedef @GCC_UINT16_TYPE@  __mpu_uint16_t;
typedef @GCC_INT32_TYPE@  __mpu_int32_t;
typedef @GCC_UINT32_TYPE@  __mpu_uint32_t;
typedef @GCC_INT64_TYPE@  __mpu_int64_t;
typedef @GCC_UINT64_TYPE@  __mpu_uint64_t;

/*******
  REAL:
 */
typedef float   __mpu_real32_t;
typedef double  __mpu_real64_t;

/*********************************
  CHAR types are always unsigned:
 */
typedef @GCC_UINT8_TYPE@  __mpu_char8_t;
typedef @GCC_UINT16_TYPE@  __mpu_char16_t;
typedef @GCC_UINT32_TYPE@  __mpu_char32_t;

/*********************************************************
  UTF-8, UCS2, UCS4 types. UTF-8 CHAR is always unsigned:
 */
typedef @GCC_UINT8_TYPE@  __mpu_utf8_t;
typedef @GCC_UINT16_TYPE@  __mpu_ucs2_t;
typedef @GCC_UINT32_TYPE@  __mpu_ucs4_t;

/*********************************************************
  Always signed with a size larger than any type of char:
 */
typedef @GCC_INT64_TYPE@  __mpu_int_c;


extern void __mpu_init( void );
extern void __mpu_free_context( void );

/********************************************************
  Error numbers:
 */
extern __mpu_error_t *__ptr_integer_error_no( void );
extern __mpu_error_t *__ptr_real_error_no   ( void );
extern __mpu_error_t *__ptr_complex_error_no( void );
extern __mpu_error_t *__ptr_math_error_no   ( void );
#define __mpu_integer_error_no  (*__ptr_integer_error_no())
#define __mpu_real_error_no     (*__ptr_real_error_no())
#define __mpu_complex_error_no  (*__ptr_complex_error_no())
#define __mpu_math_error_no     (*__ptr_math_error_no())

extern __mpu_error_t *__ptr_extra_warnings  ( void );
#define __mpu_extra_warnings    (*__ptr_extra_warnings())


extern void __mpu_clear_iflags( void );
extern void __mpu_clear_rflags( void );
extern void __mpu_clear_mflags( void );


/* Get integer flags: */
extern  int __mpu_gta( void );
extern  int __mpu_gtc( void );
extern  int __mpu_gto( void );
extern  int __mpu_gts( void );
extern  int __mpu_gtp( void );
extern  int __mpu_gtz( void );
extern  int __mpu_gtr( void );
extern  int __mpu_gtv( void );

/* Set integer flags: */
extern void __mpu_sta( void );
extern void __mpu_stc( void );
extern void __mpu_sto( void );
extern void __mpu_sts( void );
extern void __mpu_stp( void );
extern void __mpu_stz( void );
extern void __mpu_str( void );
extern void __mpu_stv( void );

/* Clear integer flags: */
extern void __mpu_cla( void );
extern void __mpu_clc( void );
extern void __mpu_clo( void );
extern void __mpu_cls( void );
extern void __mpu_clp( void );
extern void __mpu_clz( void );
extern void __mpu_clr( void );
extern void __mpu_clv( void );

/* Complement integer flags: */
extern void __mpu_cma( void );
extern void __mpu_cmc( void );
extern void __mpu_cmo( void );
extern void __mpu_cms( void );
extern void __mpu_cmp( void );
extern void __mpu_cmz( void );
extern void __mpu_cmr( void );
extern void __mpu_cmv( void );


/* Get real flags: */
extern  int __mpu_gtdom( void );
extern  int __mpu_gtsng( void );
extern  int __mpu_gtovf( void );
extern  int __mpu_gtudf( void );
extern  int __mpu_gttls( void );
extern  int __mpu_gtpls( void );
extern  int __mpu_gtind( void );
extern  int __mpu_gtinx( void );

/* Set real flags: */
extern void __mpu_stdom( void );
extern void __mpu_stsng( void );
extern void __mpu_stovf( void );
extern void __mpu_studf( void );
extern void __mpu_sttls( void );
extern void __mpu_stpls( void );
extern void __mpu_stind( void );
extern void __mpu_stinx( void );

/* Clear real flags: */
extern void __mpu_cldom( void );
extern void __mpu_clsng( void );
extern void __mpu_clovf( void );
extern void __mpu_cludf( void );
extern void __mpu_cltls( void );
extern void __mpu_clpls( void );
extern void __mpu_clind( void );
extern void __mpu_clinx( void );

/* Complement real flags: */
extern void __mpu_cmdom( void );
extern void __mpu_cmsng( void );
extern void __mpu_cmovf( void );
extern void __mpu_cmudf( void );
extern void __mpu_cmtls( void );
extern void __mpu_cmpls( void );
extern void __mpu_cmind( void );
extern void __mpu_cminx( void );


/********************************************************
  Math ERRNO declarations:
 */
#define MPU_MATH_ERROR_MSG_SIZE  4096

#define __EUNKNOWN__     0   /* unknown error type (for all sources) */

/**********************
  Integer error types:
 */
#define __I_ESIZE__      1   /* Invalid size of operand(s)  */
#define __I_ESHIFT__     2   /* Invalid number of shifts    */
#define __I_ENUMBER__    3   /* Invalid number              */
#define __I_ERADIX__     4   /* Invalid radix               */

#define __I_MAX_ERRNO    5

/*******************
  Real error types:
 */
#define __R_ESIZE__      1 /* Invalid size of operand(s)       */
#define __R_ETRUNC__     2 /* Invalid number of TRUNC bits(BZ) */

#define __R_MAX_ERRNO    3

/**********************
  Complex error types:
 */
#define __C_EDIVZEROBYZERO__   1 /* Complex attempted division by zero */
#define __C_ELOGOFZERO__       2 /* Complex attempted LOG of zero magnitude number */
#define __C_EPOWOFZERO__       3 /* Complex attempted POW of zero magnitude number */

#define __C_MAX_ERRNO    4

/*******************
  Math error types:
 */
#define __DOMAIN__       1   /* argument domain error       */
#define __SING__         2   /* argument singularity        */
#define __OVERFLOW__     3   /* overflow range error        */
#define __UNDERFLOW__    4   /* underflow range error       */
#define __TLOSS__        5   /* total loss of precision     */
#define __PLOSS__        6   /* partial loss of precision   */
#define __INVALID__      7   /* -InD - produsing operation  */
#define __INEXACT__      8   /* inexact result of operation */

#define __M_MAX_ERRNO    9


/*******************
  Struct Exception:
 */
/***
  __exception.who - источник ошибки.
 ************************************/
#define _UNKNOWN_   4
#define _COMPLEX_   3
#define _REAL_      2
#define _INTEGER_   1
#define _MATH_      0

/***
  __exception.msg_type - тип сообщения.
 ***************************************/
#define         _MSG_   2
#define   _ERROR_MSG_   1
#define _WARNING_MSG_   0

struct __exception
{
   int             who;      /* _COMPLEX_, _REAL_, _INTEGER_, _MATH_ */

   int             type;
   __mpu_char8_t  *name;
   __mpu_char8_t  *msg;
   int             msg_type; /* >= 1 - error, 0 - warning */

   int             nb_a1;    /* number of bytes in arg_1        */
   int             nb_a2;    /* number of bytes in arg_2        */
   int             nb_rv;    /* number of bytes in return_value */

   unsigned char  *arg_1;
   unsigned char  *arg_2;
   unsigned char  *return_value;
};

extern __mpu_utf8_t *
            __mpu_utf8mpu_error( int who, __mpu_error_t errnum );

extern int  __use_default_math_error;
extern int  __mpu_math_error( struct __exception *pexcept );

extern int  __use_default_mpu_warning;
extern void __mpu_warning( struct __exception *pexcept );


/***************************************************************
  Размер данных в байтах:
 ***************************************************************/
/********* integer ******
           =
 ************************/
#define NB_I8           1
#define NB_I16          2
#define NB_I32          4
#define NB_I64          8
#define NB_I128        16
#define NB_I256        32
#define NB_I512        64
#define NB_I1024      128
#define NB_I2048      256
#define NB_I4096      512
#define NB_I8192     1024
#define NB_I16384    2048
#define NB_I32768    4096
#define NB_I65536    8192
#define NB_I_MAX     8192

/********* real *********
           =
 ************************/
#define NB_R32          4
#define NB_R64          8
#define NB_R128        16
#define NB_R256        32
#define NB_R512        64
#define NB_R1024      128
#define NB_R2048      256
#define NB_R4096      512
#define NB_R8192     1024
#define NB_R16384    2048
#define NB_R32768    4096
#define NB_R65536    8192
#define NB_R_MAX     8192

/********* complex ******
           =
 ************************/
#define NB_C32          4
#define NB_C64          8
#define NB_C128        16
#define NB_C256        32
#define NB_C512        64
#define NB_C1024      128
#define NB_C2048      256
#define NB_C4096      512
#define NB_C8192     1024
#define NB_C16384    2048
#define NB_C32768    4096
#define NB_C65536    8192
#define NB_C_MAX     8192


typedef __mpu_byte_t  mpu_int;     /*    integer number */
typedef __mpu_byte_t  mpu_real;    /*       real number */
typedef __mpu_byte_t  mpu_complex; /*    complex number */
typedef __mpu_byte_t *mpu_p_num;   /* pointer to number */


/***************************************************************
  INTEGER DATA TYPES
 ***************************************************************/
typedef __mpu_byte_t  mpu_int8_t[1];
typedef __mpu_byte_t  mpu_int16_t[2];
typedef __mpu_byte_t  mpu_int32_t[4];
typedef __mpu_byte_t  mpu_int64_t[8];
typedef __mpu_byte_t  mpu_int128_t[16];
typedef __mpu_byte_t  mpu_int256_t[32];
typedef __mpu_byte_t  mpu_int512_t[64];
typedef __mpu_byte_t  mpu_int1024_t[128];
typedef __mpu_byte_t  mpu_int2048_t[256];
typedef __mpu_byte_t  mpu_int4096_t[512];
typedef __mpu_byte_t  mpu_int8192_t[1024];
typedef __mpu_byte_t  mpu_int16384_t[2048];
typedef __mpu_byte_t  mpu_int32768_t[4096];
typedef __mpu_byte_t  mpu_int65536_t[8192];
typedef __mpu_byte_t  mpu_wide_int_t[8192];


/***************************************************************
  REAL DATA TYPES
 ***************************************************************/
typedef __mpu_byte_t  mpu_real32_t[4];
typedef __mpu_byte_t  mpu_real64_t[8];
typedef __mpu_byte_t  mpu_real128_t[16];
typedef __mpu_byte_t  mpu_real256_t[32];
typedef __mpu_byte_t  mpu_real512_t[64];
typedef __mpu_byte_t  mpu_real1024_t[128];
typedef __mpu_byte_t  mpu_real2048_t[256];
typedef __mpu_byte_t  mpu_real4096_t[512];
typedef __mpu_byte_t  mpu_real8192_t[1024];
typedef __mpu_byte_t  mpu_real16384_t[2048];
typedef __mpu_byte_t  mpu_real32768_t[4096];
typedef __mpu_byte_t  mpu_real65536_t[8192];
typedef __mpu_byte_t  mpu_wide_real_t[8192];


/***************************************************************
  COMPLEX DATA TYPES

  NOTE:
        Следует помнить, что при вызове функций, работающих
        с комплексными числами надо задавать не фактический,
        а половинный размер комплексных операндов !
        SEE:
           following NB_C32, NB_C64, ..., NB_C1024 NB_C_MAX.
 ***************************************************************/
typedef __mpu_byte_t  mpu_complex32_t[8];
typedef __mpu_byte_t  mpu_complex64_t[16];
typedef __mpu_byte_t  mpu_complex128_t[32];
typedef __mpu_byte_t  mpu_complex256_t[64];
typedef __mpu_byte_t  mpu_complex512_t[128];
typedef __mpu_byte_t  mpu_complex1024_t[256];
typedef __mpu_byte_t  mpu_complex2048_t[512];
typedef __mpu_byte_t  mpu_complex4096_t[1024];
typedef __mpu_byte_t  mpu_complex8192_t[2048];
typedef __mpu_byte_t  mpu_complex16384_t[4096];
typedef __mpu_byte_t  mpu_complex32768_t[8192];
typedef __mpu_byte_t  mpu_complex65536_t[16384];
typedef __mpu_byte_t  mpu_wide_complex_t[16384];


/***************************************************************
                 INTEGER ARITHMETIC OPERATIONS
 ***************************************************************/

extern void iadd    ( mpu_int *c, mpu_int *a, mpu_int *b, int nb );
extern void iadc    ( mpu_int *c, mpu_int *a, mpu_int *b, int nb );
extern void isub    ( mpu_int *c, mpu_int *a, mpu_int *b, int nb );
extern void isbb    ( mpu_int *c, mpu_int *a, mpu_int *b, int nb );

extern void ishl    ( mpu_int *c, mpu_int *a, int nb );
extern void ishr    ( mpu_int *c, mpu_int *a, int nb );
extern void isal    ( mpu_int *c, mpu_int *a, int nb );
extern void isar    ( mpu_int *c, mpu_int *a, int nb );

extern void irol    ( mpu_int *c, mpu_int *a, int nb );
extern void iror    ( mpu_int *c, mpu_int *a, int nb );
extern void ircl    ( mpu_int *c, mpu_int *a, int nb );
extern void ircr    ( mpu_int *c, mpu_int *a, int nb );

extern void ishln   ( mpu_int *c, mpu_int *a, unsigned int ns, int nb );
extern void ishrn   ( mpu_int *c, mpu_int *a, unsigned int ns, int nb );
extern void isaln   ( mpu_int *c, mpu_int *a, unsigned int ns, int nb );
extern void isarn   ( mpu_int *c, mpu_int *a, unsigned int ns, int nb );

extern void iroln   ( mpu_int *c, mpu_int *a, unsigned int ns, int nb );
extern void irorn   ( mpu_int *c, mpu_int *a, unsigned int ns, int nb );
extern void ircln   ( mpu_int *c, mpu_int *a, unsigned int ns, int nb );
extern void ircrn   ( mpu_int *c, mpu_int *a, unsigned int ns, int nb );

extern void inot    ( mpu_int *c, mpu_int *a, int nb );
extern void ineg    ( mpu_int *c, mpu_int *a, int nb );

extern void iand    ( mpu_int *c, mpu_int *a, mpu_int *b, int nb );

extern void itest   ( mpu_int *a, mpu_int *b, int nb );
extern void icmp    ( mpu_int *a, mpu_int *b, int nb );

extern void ior     ( mpu_int *c, mpu_int *a, mpu_int *b, int nb );
extern void ixor    ( mpu_int *c, mpu_int *a, mpu_int *b, int nb );

extern void iinc    ( mpu_int *c, mpu_int *a, int nb );
extern void idec    ( mpu_int *c, mpu_int *a, int nb );

extern void ixchg   ( mpu_int *a, mpu_int *b, int nb );

extern void icpy    ( mpu_int *c, mpu_int *a, int nb_c, int nb_a );
extern void icvt    ( mpu_int *c, mpu_int *a, int nb_c, int nb_a );

extern void imul    ( mpu_int *prod, mpu_int *num, mpu_int *mul, int nb_prod, int nb_num );
extern void ismul   ( mpu_int *prod, mpu_int *num, mpu_int *mul, int nb_prod, int nb_num );

extern void idiv    ( mpu_int *quot, mpu_int *rem, mpu_int *num, mpu_int *den, int nb );
extern void isdiv   ( mpu_int *quot, mpu_int *rem, mpu_int *num, mpu_int *den, int nb );


/* for integer ...itoa() functions */
#define RADIX_BIN  2
#define RADIX_OCT  8
#define RADIX_DEC 10
#define RADIX_HEX 16

/* for integer ...itoa() functions and real ...rtoa() functions */
#define LOWERCASE  0
#define UPPERCASE  1


extern void iatoi   ( mpu_int *c, __mpu_char8_t *str, int nb );
extern void iatoui  ( mpu_int *c, __mpu_char8_t *str, int nb );

extern void iitoa   ( __mpu_char8_t *str, mpu_int *a, int radix, int uf, int nb );
extern void iuitoa  ( __mpu_char8_t *str, mpu_int *a, int radix, int uf, int nb );


/***************************************************************
                   REAL ARITHMETIC OPERATIONS
 ***************************************************************/

extern int  _sizeof_exp       ( int nb );
extern int  _real_mant_digs   ( int nb );
extern int  _real_digs        ( int nb );
extern int  _real_max_string  ( int nb );
extern void _real_epsilon     ( mpu_real *c, int nb );
extern void _real_max_10_exp  ( mpu_int *e, int nb_e, int nb_r );
extern void _real_min_10_exp  ( mpu_int *e, int nb_e, int nb_r );
extern void _real_max_max_exp ( mpu_int *e, int nb_e, int nb_r );
extern void _real_max_exp     ( mpu_int *e, int nb_e, int nb_r );
extern void _real_min_exp     ( mpu_int *e, int nb_e, int nb_r );

extern void _m_zero           ( mpu_real *c, int nb );
extern void _m_half           ( mpu_real *c, int nb );
extern void _m_one            ( mpu_real *c, int nb );
extern void _m_two            ( mpu_real *c, int nb );
extern void _m_ten            ( mpu_real *c, int nb );
extern void _m_mten           ( mpu_real *c, int nb );
extern void _m_32             ( mpu_real *c, int nb );
extern void _m_PI             ( mpu_real *c, int nb );
extern void _m_E              ( mpu_real *c, int nb );
extern void _m_1_ln2          ( mpu_real *c, int nb );
extern void _m_ln2            ( mpu_real *c, int nb );
extern void _m_1_ln10         ( mpu_real *c, int nb );
extern void _m_ln10           ( mpu_real *c, int nb );
extern void _m_1_lg2          ( mpu_real *c, int nb );
extern void _m_lg2            ( mpu_real *c, int nb );
extern void _m_PI_2           ( mpu_real *c, int nb );
extern void _m_PI_3           ( mpu_real *c, int nb );
extern void _m_PI_4           ( mpu_real *c, int nb );
extern void _m_PI_5           ( mpu_real *c, int nb );
extern void _m_PI_6           ( mpu_real *c, int nb );
extern void _m_1_PI           ( mpu_real *c, int nb );
extern void _m_2_PI           ( mpu_real *c, int nb );
extern void _m_3_PI           ( mpu_real *c, int nb );
extern void _m_4_PI           ( mpu_real *c, int nb );
extern void _m_5_PI           ( mpu_real *c, int nb );
extern void _m_2PI            ( mpu_real *c, int nb );
extern void _m_3PI            ( mpu_real *c, int nb );
extern void _m_1_2PI          ( mpu_real *c, int nb );
extern void _m_1_3PI          ( mpu_real *c, int nb );
extern void _m_1_4PI          ( mpu_real *c, int nb );
extern void _m_1_5PI          ( mpu_real *c, int nb );
extern void _m_1_6PI          ( mpu_real *c, int nb );
extern void _m_3PI_4          ( mpu_real *c, int nb );
extern void _m_SQRTPI         ( mpu_real *c, int nb );
extern void _m_1_SQRTPI       ( mpu_real *c, int nb );
extern void _m_2_SQRTPI       ( mpu_real *c, int nb );
extern void _m_SQRT2          ( mpu_real *c, int nb );
extern void _m_1_SQRT2        ( mpu_real *c, int nb );
extern void _m_SQRT3          ( mpu_real *c, int nb );
extern void _m_1_SQRT3        ( mpu_real *c, int nb );
extern void _m_DEGREE         ( mpu_real *c, int nb );
extern void _m_1_DEGREE       ( mpu_real *c, int nb );
extern void _m_GOLDENRATIO    ( mpu_real *c, int nb );
extern void _m_EULERGAMMA     ( mpu_real *c, int nb );
extern void _m_CATALAN        ( mpu_real *c, int nb );

extern void _ind              ( mpu_real *c, int nb );
extern int  _is_ind           ( mpu_real *c, int nb );
extern void _nan              ( mpu_real *c, unsigned int sign, int nb );
extern int  _is_nans          ( mpu_real *c, int nb );
extern void _nan_max          ( mpu_real *c, unsigned int sign, int nb );
extern int  _is_nan_max       ( mpu_real *c, int nb );
extern void _nan_min          ( mpu_real *c, unsigned int sign, int nb );
extern int  _is_nan_min       ( mpu_real *c, int nb );
extern void _inf              ( mpu_real *c, unsigned int sign, int nb );
extern int  _is_inf           ( mpu_real *c, int nb );
extern void _real_min         ( mpu_real *c, unsigned int sign, int nb );
extern void _real_max         ( mpu_real *c, unsigned int sign, int nb );
extern void _signull          ( mpu_real *c, unsigned int sign, int nb );
extern int  _is_signull       ( mpu_real *c, int nb );

extern void r_neg             ( mpu_real *c, int nb );
extern int  r_is_neg          ( mpu_real *c, int nb );
extern void r_abs             ( mpu_real *c, int nb );
extern int  r_sign            ( mpu_real *c, int nb );

extern int  r_cmp             ( mpu_real *a, mpu_real *b, int nb );
extern void r_cpy             ( mpu_real *a, mpu_real *b, int nb );
extern void r_cvt             ( mpu_real *a, mpu_real *b, int nb_a, int nb_b );

extern void r_add             ( mpu_real *c, mpu_real *a, mpu_real *b, int nb );
extern void r_sub             ( mpu_real *c, mpu_real *a, mpu_real *b, int nb );
extern void r_mul             ( mpu_real *c, mpu_real *a, mpu_real *b, int nb );
extern void r_div             ( mpu_real *c, mpu_real *a, mpu_real *b, int nb );

extern void ltor              ( mpu_real *r, mpu_int *l, int nb_r, int nb_l );
extern void ultor             ( mpu_real *r, mpu_int *l, int nb_r, int nb_l );
extern void rtol_frac         ( mpu_int *l, mpu_real *frac, mpu_real *r, int nb_l, int nb_r );
extern void rtoul_frac        ( mpu_int *l, mpu_real *frac, mpu_real *r, int nb_l, int nb_r );

extern void r_remain          ( mpu_real *r, mpu_real *a, mpu_real *b, int nb );

extern void r_floor           ( mpu_real *c, mpu_real *a, int nb );
extern void r_ceil            ( mpu_real *c, mpu_real *a, int nb );
extern void r_round           ( mpu_real *c, mpu_real *a, int nb );
extern void r_frexp           ( mpu_real *s, mpu_int *lexp, mpu_real *r, int nb_l, int nb_r );
extern void r_ldexp           ( mpu_real *c, mpu_real *r, mpu_int *lpwr2, int nb_r, int nb_l );
extern void r_logb            ( mpu_int *lbase2, mpu_real *r, int nb_l, int nb_r );
extern void r_modf            ( mpu_real *fract, mpu_real *integer, mpu_real *r, int nb );

extern void r_sqrt            ( mpu_real *c, mpu_real *a, int nb );

extern void r_sin             ( mpu_real *y, mpu_real *x, int nb );
extern void r_cos             ( mpu_real *y, mpu_real *x, int nb );
extern void r_tan             ( mpu_real *y, mpu_real *x, int nb );

extern void r_log1p           ( mpu_real *y, mpu_real *x, int nb );

extern void r_log             ( mpu_real *y, mpu_real *x, int nb );
extern void r_log10           ( mpu_real *y, mpu_real *x, int nb );
extern void r_log2            ( mpu_real *y, mpu_real *x, int nb );

extern void r_expm1           ( mpu_real *y, mpu_real *x, int nb );
extern void r_exp             ( mpu_real *y, mpu_real *x, int nb );

extern void r_atan2           ( mpu_real *c, mpu_real *y, mpu_real *x, int nb );

extern void r_sinh            ( mpu_real *y, mpu_real *x, int nb );
extern void r_cosh            ( mpu_real *y, mpu_real *x, int nb );
extern void r_tanh            ( mpu_real *y, mpu_real *x, int nb );

extern void r_asinh           ( mpu_real *y, mpu_real *x, int nb );
extern void r_acosh           ( mpu_real *y, mpu_real *x, int nb );
extern void r_atanh           ( mpu_real *y, mpu_real *x, int nb );

extern void r_asin            ( mpu_real *y, mpu_real *x, int nb );
extern void r_acos            ( mpu_real *y, mpu_real *x, int nb );
extern void r_atan            ( mpu_real *y, mpu_real *x, int nb );

extern void r_pow             ( mpu_real *c, mpu_real *x, mpu_real *y, int nb );

extern void r_hypot           ( mpu_real *c, mpu_real *x, mpu_real *y, int nb );


#define _ASCII_TO_REAL_ERROR  (-1) /* error */
#define _LONGHAND_REAL_NUMBER   0  /* прочитано простое число (типа 1e1) */
#define _REAL_PART_OF_COMPLEX   1  /* прочитана вещественная часть комплексного числа (типа 1r1) */
#define _IMAGINARY_OF_COMPLEX   2  /* прочитана мнимая часть комплексного числа (типа 1i1, 1j1) */

extern int  ascii_to_real     ( mpu_real *c, __mpu_char8_t *s, int nb );

extern void real_to_ascii     ( __mpu_char8_t *s, mpu_real *c,
                                int ndigs, int exp_delim, int exp_digs, int gen_plus, int nb );


extern void c_real_part       ( mpu_real *r, mpu_complex *c, int nb );
extern void c_imaginary       ( mpu_real *r, mpu_complex *c, int nb );

extern void c_real_to_complex ( mpu_complex *c, mpu_real *r, int nb );
extern void c_gen_complex     ( mpu_complex *c, mpu_real *r, mpu_real *j, int nb );
extern void c_polar           ( mpu_complex *c, mpu_real *rho, mpu_real *theta, int nb );

extern void c_conj            ( mpu_complex *c, mpu_complex *x, int nb );
extern void c_abs             ( mpu_real *r, mpu_complex *c, int nb );
extern void c_norm            ( mpu_real *r, mpu_complex *c, int nb );
extern void c_arg             ( mpu_real *r, mpu_complex *c, int nb );

extern int  c_is_equal        ( mpu_complex *a, mpu_complex *b, int nb );
extern int  c_is_nequal       ( mpu_complex *a, mpu_complex *b, int nb );

extern void c_cpy             ( mpu_complex *a, mpu_complex *b, int nb );
extern void c_cvt             ( mpu_complex *a, mpu_complex *b, int nb_a, int nb_b );

extern void c_add             ( mpu_complex *c, mpu_complex *a, mpu_complex *b, int nb );
extern void c_sub             ( mpu_complex *c, mpu_complex *a, mpu_complex *b, int nb );
extern void c_mul             ( mpu_complex *c, mpu_complex *a, mpu_complex *b, int nb );
extern void c_div             ( mpu_complex *c, mpu_complex *a, mpu_complex *b, int nb );

extern void c_exp             ( mpu_complex *y, mpu_complex *x, int nb );

extern void c_sin             ( mpu_complex *y, mpu_complex *x, int nb );
extern void c_cos             ( mpu_complex *y, mpu_complex *x, int nb );

extern void c_sinh            ( mpu_complex *y, mpu_complex *x, int nb );
extern void c_cosh            ( mpu_complex *y, mpu_complex *x, int nb );

extern void c_log             ( mpu_complex *y, mpu_complex *x, int nb );
extern void c_pow             ( mpu_complex *y, mpu_complex *x, mpu_complex *p, int nb );

extern void c_sqrt            ( mpu_complex *y, mpu_complex *x, int nb );



#ifdef  __cplusplus
}   /* ... extern "C" */
#endif

#endif /* __LIB_MPU_H */