summaryrefslogtreecommitdiff
path: root/man/ru/_int_digs.3mpu
blob: 5c0bc70e00a899015cf04fd6f839f29bbd0117d3 (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
.\" Copyright 2026 Andrew V.Kosteltsev (kx@radix-linux.su)
.\"
.\"
.TH _int_digs 3  "September 15, 2026" "libmpu" "LibMPU Programmer's Manual"
.SH NAME
\fB_int_digs\fP \- максимальный размер буфера для десятичного представления беззнакового целого числа
.SH SYNOPSIS
.nf
.B #include <libmpu.h>
.PP
.BI "int _int_digs( int " nb " );"
.fi
.SH DESCRIPTION
Функция \fB_int_digs()\fP возвращает максимальный размер буфера в байтах, достаточный
для хранения десятичного представления беззнакового целого числа размером \fBnb\fP байт,
включая завершающий символ \fB'\\0'\fP.
.PP
Функция не анализирует значение самого целого числа. Результат зависит только от размера,
заданного параметром \fBnb\fP, поэтому функция может использоваться для выделения памяти
под строку до преобразования беззнакового целого LibMPU в десятичное представление.
.PP
Для целого числа размером \fBnb\fP байт максимальное количество значащих битов равно
.sp
.nf
        8 * nb
.fi
.sp
а максимальное количество десятичных цифр определяется выражением
.sp
.nf
        ceil( 8 * nb * log10(2) ).
.fi
.sp
Реализация не использует вычисления с плавающей точкой и функции библиотеки \fBlibm\fP.
Используется верхнее рациональное приближение
.sp
.nf
        log10(2) < 30103 / 100000
.fi
.sp
поэтому количество десятичных цифр вычисляется целочисленно как
.sp
.nf
        (nb * 30103 + 12499) / 12500
.fi
.sp
и дополнительно учитывается один байт для завершающего символа \fB'\\0'\fP.
.PP
В качестве аргумента \fBnb\fP обычно следует передавать одну из констант размера целых
чисел, определённых в \fBlibmpu.h\fP, например \fBNB_I8\fP, \fBNB_I16\fP, ...,
\fBNB_I65536\fP.
.PP
Функция не требует наличия арифметического контекста \fBLibMPU\fP и не изменяет флаги
целочисленных операций.
.SH RETURN VALUE
При \fBnb > 0\fP функция возвращает размер буфера, достаточный для размещения наибольшего
возможного беззнакового десятичного значения заданного размера вместе с завершающим
символом \fB'\\0'\fP. При \fBnb < 1\fP функция возвращает \fB0\fP.
.sp
Например:
.sp
.nf
        _int_digs( NB_I8 )      =     4
        _int_digs( NB_I16 )     =     6
        _int_digs( NB_I32 )     =    11
        _int_digs( NB_I64 )     =    21
        _int_digs( NB_I1024 )   =   310
        _int_digs( NB_I65536 )  = 19730
.fi
.SH EXAMPLES
.nf
.sp
#include <libmpu.h>
#include <stdio.h>

int main( void )
{
  int  rc = 0;

  __mpu_init();
  __mpu_extra_warnings = 1;

  {
    mpu_int65536_t  c;
    int             nb = NB_I65536;

    printf( "sizeof(c) = %d;\\n", (int)sizeof(c) );

    /* Максимальный размер буфера в байтах, включая завершающий '\\0'. */
    printf( "_int_digs(%d) = %d;\\n", nb,         _int_digs(nb)         );
    printf( "_int_digs(%d) = %d;\\n", NB_I32768,  _int_digs(NB_I32768)  );
    printf( "_int_digs(%d) = %d;\\n", NB_I16384,  _int_digs(NB_I16384)  );
    printf( "_int_digs(%d) = %d;\\n", NB_I8192,   _int_digs(NB_I8192)   );
    printf( "_int_digs(%d) = %d;\\n", NB_I4096,   _int_digs(NB_I4096)   );
    printf( "_int_digs(%d) = %d;\\n", NB_I2048,   _int_digs(NB_I2048)   );
    printf( "_int_digs(%d) = %d;\\n", NB_I1024,   _int_digs(NB_I1024)   );
    printf( "_int_digs(%d) = %d;\\n", NB_I512,    _int_digs(NB_I512)    );
    printf( "_int_digs(%d) = %d;\\n", NB_I256,    _int_digs(NB_I256)    );
    printf( "_int_digs(%d) = %d;\\n", NB_I128,    _int_digs(NB_I128)    );
    printf( "_int_digs(%d) = %d;\\n", NB_I64,     _int_digs(NB_I64)     );
    printf( "_int_digs(%d) = %d;\\n", NB_I32,     _int_digs(NB_I32)     );
    printf( "_int_digs(%d) = %d;\\n", NB_I16,     _int_digs(NB_I16)     );
    printf( "_int_digs(%d) = %d;\\n", NB_I8,      _int_digs(NB_I8)      );
  }

  __mpu_free_context();

  return( rc );
}
.fi
.sp
.SH SEE ALSO
.BR ibits_len(3),
.BR libmpu(7).