メインページ   モジュール   データ構造   ファイル一覧   データフィールド   グローバル  

代入
[多倍長整数]


モジュール

下位関数群

マクロ定義

#define define_ymp_assign_integral_type(type, postfix, sign_check)
#define ymp_assign_zero(self)   (void)((self)->used = 0)
 多倍長整数に0を代入. より詳しく...


関数

void ymp_assign (mp_ref_t self, mp_cref_t other)
 多倍長整数の値をディープコピーにより代入. より詳しく...

void ymp_assign_digit (mp_ref_t self, digit_t other)
 多倍長整数の値をdigit_tから代入. より詳しく...

void ymp_assign_array (mp_ref_t self, size_t len, const digit_t *array)
 多倍長整数にdigit_tの列から代入. より詳しく...

void ymp_assign_char (mp_ref_t self, signed char val)
 多倍長整数に signed char 型から値を代入. より詳しく...

void ymp_assign_short (mp_ref_t self, short val)
 多倍長整数に short 型から値を代入. より詳しく...

void ymp_assign_int (mp_ref_t self, int val)
 多倍長整数に int 型から値を代入. より詳しく...

void ymp_assign_long (mp_ref_t self, long val)
 多倍長整数に long 型から値を代入. より詳しく...

void ymp_assign_uchar (mp_ref_t self, unsigned char val)
 多倍長整数に unsigned char 型から値を代入. より詳しく...

void ymp_assign_ushort (mp_ref_t self, unsigned short val)
 多倍長整数に unsigned short 型から値を代入. より詳しく...

void ymp_assign_uint (mp_ref_t self, unsigned int val)
 多倍長整数に unsigned int 型から値を代入. より詳しく...

void ymp_assign_ulong (mp_ref_t self, unsigned long val)
 多倍長整数に unsigned long 型から値を代入. より詳しく...

void ymp_assign_intmax (mp_ref_t self, intmax_t val)
 多倍長整数に intmax_t 型から値を代入. より詳しく...

void ymp_assign_uintmax (mp_ref_t self, uintmax_t val)
 多倍長整数に uintmax_t 型から値を代入. より詳しく...

void ymp_assign_double (mp_ref_t self, double val)
 多倍長整数にdouble型から値を代入. より詳しく...

void ymp_assign_2exp (mp_ref_t self, size_t pow)
 多倍長整数に2の冪を代入. より詳しく...

void ymp_swap (mp_ref_t self, mp_ref_t other)
 多倍長整数の値を交換. より詳しく...

void ymp_assign_string (mp_ref_t self, const char *psz, char **endptr, unsigned radix)
 文字列形式で表された整数値をstruct multiprecに代入. より詳しく...


マクロ定義の解説

#define define_ymp_assign_integral_type type,
postfix,
sign_check   
 

値:

                                                                        \
void ymp_assign_##postfix(mp_ref_t self, type val)                      \
{                                                                       \
  do_assign_integral_value(type, self, val, ymp_reserve, sign_check);   \
}

construct.c435 行で定義されています。

#define ymp_assign_zero self       (void)((self)->used = 0)
 

多倍長整数に0を代入.

引数:
self  代入される多倍長整数へのポインタ
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

multiprec.h351 行で定義されています。


関数の解説

void ymp_assign mp_ref_t    self,
mp_cref_t    other
 

多倍長整数の値をディープコピーにより代入.

otherの保持している整数値をselfにディープコピーする。

引数:
self  値を代入されるstruct multiprecへのポインタ
other  代入すべき整数値を保持しているstruct multiprecへのポインタ
事前条件:
selfは初期化済のこと。未初期化の場合の動作は不定

construct.c389 行で定義されています。

参照 mp_cref_t, multiprec::sign, と ymp_assign_abs.

00390 {
00391   self->sign = other->sign;
00392   ymp_assign_abs(self, other);
00393 }

void ymp_assign_digit mp_ref_t    self,
digit_t    other
 

多倍長整数の値をdigit_tから代入.

引数:
self  値を代入されるstruct multiprecへのポインタ
other  代入すべきdigit_t値
事前条件:
selfは初期化済のこと。未初期化の場合の動作は不定

construct.c404 行で定義されています。

参照 digit_t, positive_sign, multiprec::sign, と ymp_assign_abs_digit.

00405 {
00406   self->sign = positive_sign;
00407   ymp_assign_abs_digit(self, other);
00408 }

void ymp_assign_array mp_ref_t    self,
size_t    len,
const digit_t   array
 

多倍長整数にdigit_tの列から代入.

引数:
self  値を代入されるstruct multiprecへのポインタ
len  arrayがポイントする配列の要素数
array  代入すべき整数値を保持しているdigit_tの列の先頭へのポインタ
事前条件:
selfは初期化済のこと。未初期化の場合の動作は不定

construct.c419 行で定義されています。

参照 digit_t, positive_sign, multiprec::sign, と ymp_assign_abs_array.

00420 {
00421   self->sign = positive_sign;
00422   ymp_assign_abs_array(self, len, array);
00423 } 

void ymp_assign_char mp_ref_t    self,
signed char    val
 

多倍長整数に signed char 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c447 行で定義されています。

参照 to_sign_check.

00469 {

void ymp_assign_short mp_ref_t    self,
short    val
 

多倍長整数に short 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c448 行で定義されています。

参照 to_sign_check.

00469 {

void ymp_assign_int mp_ref_t    self,
int    val
 

多倍長整数に int 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c449 行で定義されています。

参照 to_sign_check.

00469 {

void ymp_assign_long mp_ref_t    self,
long    val
 

多倍長整数に long 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c450 行で定義されています。

参照 to_sign_check.

00469 {

void ymp_assign_uchar mp_ref_t    self,
unsigned char    val
 

多倍長整数に unsigned char 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c451 行で定義されています。

参照 not_to_sign_check.

00469 {

void ymp_assign_ushort mp_ref_t    self,
unsigned short    val
 

多倍長整数に unsigned short 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c452 行で定義されています。

参照 not_to_sign_check.

00469 {

void ymp_assign_uint mp_ref_t    self,
unsigned int    val
 

多倍長整数に unsigned int 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c453 行で定義されています。

参照 not_to_sign_check.

00469 {

void ymp_assign_ulong mp_ref_t    self,
unsigned long    val
 

多倍長整数に unsigned long 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c454 行で定義されています。

参照 not_to_sign_check.

00469 {

void ymp_assign_intmax mp_ref_t    self,
intmax_t    val
 

多倍長整数に intmax_t 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c456 行で定義されています。

参照 to_sign_check.

00469 {

void ymp_assign_uintmax mp_ref_t    self,
uintmax_t    val
 

多倍長整数に uintmax_t 型から値を代入.

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c457 行で定義されています。

参照 not_to_sign_check.

00469 {

void ymp_assign_double mp_ref_t    self,
double    val
 

多倍長整数にdouble型から値を代入.

double型の値の整数部分が代入される。

引数:
self  代入される多倍長整数へのポインタ
val  代入する値
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c468 行で定義されています。

参照 do_assign_floating_value, と ymp_reserve.

00469 {
00470   do_assign_floating_value(double,, "ymp_assign_by_double", ymp_reserve);
00471 }

void ymp_assign_2exp mp_ref_t    self,
size_t    pow
 

多倍長整数に2の冪を代入.

<self> := 2**pow

引数:
self  代入される多倍長整数へのポインタ
pow  冪指数
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定

construct.c481 行で定義されています。

参照 DIGIT_BIT, digit_t, multiprec::digits, positive_sign, multiprec::sign, multiprec::used, と ymp_reserve.

00482 {
00483   size_t n_digits = pow / DIGIT_BIT, n_bits = pow % DIGIT_BIT;
00484 
00485   self->sign = positive_sign;
00486   ymp_reserve(self, n_digits+1);
00487   self->used = n_digits + 1;
00488   memset(self->digits, 0, sizeof(digit_t)*n_digits);
00489   self->digits[n_digits] = 1u << n_bits;
00490 }

void ymp_swap mp_ref_t    self,
mp_ref_t    other
 

多倍長整数の値を交換.

selfとotherがそれぞれ保持している整数値を交換する

引数:
self  多倍長整数値を保持するstruct multiprecへのポインタ
other  多倍長整数値を保持するstruct multiprecへのポインタ

construct.c499 行で定義されています。

参照 digit_t, multiprec::digits, multiprec::len, mp_sign_t, multiprec::sign, と multiprec::used.

00500 {
00501   enum mp_sign_t tmp_sign;
00502   size_t tmp_size;
00503   digit_t *tmp_digits;
00504 
00505   tmp_sign = self->sign;
00506   self->sign = other->sign;
00507   other->sign = tmp_sign;
00508 
00509   tmp_size = self->len;
00510   self->len = other->len;
00511   other->len = tmp_size;
00512 
00513   tmp_size = self->used;
00514   self->used = other->used;
00515   other->used = tmp_size;
00516 
00517   tmp_digits = self->digits;
00518   self->digits = other->digits;
00519   other->digits = tmp_digits;
00520 }

void ymp_assign_string mp_ref_t    self,
const char *    psz,
char **    endptr,
unsigned    radix
[inline]
 

文字列形式で表された整数値をstruct multiprecに代入.

引数のの意味はstrtol(), strtoul()と同じ

引数:
self  代入される多倍長整数へのポインタ
psz  代入する値.
endptr  NULLでなければ、整数として認識できなくなった最初の位置への ポインタが*endptrに格納される
radix  文字列表現の基数。0ならば基数は整数値のプレフィックスから 自動的に決定される
事前条件:
selfは初期化済のこと。未初期化の場合、動作は不定
0 <= radix <= 36
例外:
ymp_error  radixが範囲外のとき
ymp_alloc_error  格納領域のメモリーを確保できないとき

construct_str.c32 行で定義されています。

参照 digit_t, multiprec::digits, MULTIPREC_RADIX, negative_sign, positive_sign, multiprec::sign, multiprec::used, ymp_addabs, ymp_error, ymp_mulabs_digit, と ymp_reserve.

00034 {
00035   if (radix > 36)
00036     ymp_error("文字列からの変換の基数が大きすぎる: %u", radix);
00037 
00038   switch (*psz)
00039     {
00040     case '-':
00041       ++psz;
00042       self->sign = negative_sign;
00043       break;
00044     case '+':
00045       ++psz; /* no break */
00046     default:
00047       self->sign = positive_sign;
00048     }
00049 
00050   if (radix == 0)
00051     {
00052       if (*psz != '0') radix = 10;
00053       else switch (*++psz)
00054         {
00055         case 'B': case 'b': radix = 2; ++psz; break;
00056         case 'Q': case 'q': radix = 4; ++psz; break;
00057         case 'O': case 'o': radix = 8; ++psz; break;
00058         case 'D': case 'd': radix = 10; ++psz; break;
00059         case 'X': case 'x': radix = 16; ++psz; break;
00060         default: radix = 8; break;
00061         }
00062     }
00063 
00064   ymp_reserve(self, ceil(strlen(psz)*(log(radix)/log(MULTIPREC_RADIX)))+1);
00065 
00066   self->used = 0; self->digits[0] = 0;
00067   for ( ; *psz; ++psz)
00068     {
00069       digit_t c;
00070       switch (*psz)
00071         {
00072         case '0': c = 0; break; case '1': c = 1; break;
00073         case '2': c = 2; break; case '3': c = 3; break;
00074         case '4': c = 4; break; case '5': c = 5; break;
00075         case '6': c = 6; break; case '7': c = 7; break;
00076         case '8': c = 8; break; case '9': c = 9; break;
00077         case 'A': case 'a': c = 10; break;
00078         case 'B': case 'b': c = 11; break;
00079         case 'C': case 'c': c = 12; break;
00080         case 'D': case 'd': c = 13; break;
00081         case 'E': case 'e': c = 14; break;
00082         case 'F': case 'f': c = 15; break;
00083         case 'G': case 'g': c = 16; break;
00084         case 'H': case 'h': c = 17; break;
00085         case 'I': case 'i': c = 18; break;
00086         case 'J': case 'j': c = 19; break;
00087         case 'K': case 'k': c = 20; break;
00088         case 'L': case 'l': c = 21; break;
00089         case 'M': case 'm': c = 22; break;
00090         case 'N': case 'n': c = 23; break;
00091         case 'O': case 'o': c = 24; break;
00092         case 'P': case 'p': c = 25; break;
00093         case 'Q': case 'q': c = 26; break;
00094         case 'R': case 'r': c = 27; break;
00095         case 'S': case 's': c = 28; break;
00096         case 'T': case 't': c = 29; break;
00097         case 'U': case 'u': c = 30; break;
00098         case 'V': case 'v': c = 31; break;
00099         case 'W': case 'w': c = 32; break;
00100         case 'X': case 'x': c = 33; break;
00101         case 'Y': case 'y': c = 34; break;
00102         case 'Z': case 'z': c = 35; break;
00103 
00104         case '_': continue;
00105         default: c = 127;
00106         }
00107       if (c >= radix) break;
00108 
00109       ymp_reserve(self, self->used+1);
00110       self->used
00111         = ymp_mulabs_digit(self->digits, self->digits, radix, self->used);
00112       self->used
00113         = ymp_addabs(self->digits, self->digits, &c, self->used, 1);
00114     }
00115   
00116   if (endptr) *endptr = (char*)psz;
00117 }


YMPに対してTue Mar 16 19:23:52 2004に生成されました。 doxygen1.2.14 作者 Dimitri van Heesch, © 1997-2002