📄 aors.h
字号:
/* mpz_add, mpz_sub -- add or subtract integers.Copyright 1991, 1993, 1994, 1996, 2000, 2001 Free Software Foundation, Inc.This file is part of the GNU MP Library.The GNU MP Library is free software; you can redistribute it and/or modifyit under the terms of the GNU Lesser General Public License as published bythe Free Software Foundation; either version 2.1 of the License, or (at youroption) any later version.The GNU MP Library is distributed in the hope that it will be useful, butWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITYor FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General PublicLicense for more details.You should have received a copy of the GNU Lesser General Public Licensealong with the GNU MP Library; see the file COPYING.LIB. If not, write tothe Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,MA 02111-1307, USA. */#include "gmp.h"#include "gmp-impl.h"#ifdef BERKELEY_MP#include "mp.h"#ifdef OPERATION_add#define FUNCTION madd#define VARIATION#endif#ifdef OPERATION_sub#define FUNCTION msub#define VARIATION -#endif#define ARGUMENTS mpz_srcptr u, mpz_srcptr v, mpz_ptr w#else /* normal GMP */#ifdef OPERATION_add#define FUNCTION mpz_add#define VARIATION#endif#ifdef OPERATION_sub#define FUNCTION mpz_sub#define VARIATION -#endif#define ARGUMENTS mpz_ptr w, mpz_srcptr u, mpz_srcptr v#endif#ifndef FUNCTIONError, need OPERATION_add or OPERATION_sub#endifvoidFUNCTION (ARGUMENTS){ mp_srcptr up, vp; mp_ptr wp; mp_size_t usize, vsize, wsize; mp_size_t abs_usize; mp_size_t abs_vsize; usize = u->_mp_size; vsize = VARIATION v->_mp_size; abs_usize = ABS (usize); abs_vsize = ABS (vsize); if (abs_usize < abs_vsize) { /* Swap U and V. */ MPZ_SRCPTR_SWAP (u, v); MP_SIZE_T_SWAP (usize, vsize); MP_SIZE_T_SWAP (abs_usize, abs_vsize); } /* True: ABS_USIZE >= ABS_VSIZE. */ /* If not space for w (and possible carry), increase space. */ wsize = abs_usize + 1; if (w->_mp_alloc < wsize) _mpz_realloc (w, wsize); /* These must be after realloc (u or v may be the same as w). */ up = u->_mp_d; vp = v->_mp_d; wp = w->_mp_d; if ((usize ^ vsize) < 0) { /* U and V have different sign. Need to compare them to determine which operand to subtract from which. */ /* This test is right since ABS_USIZE >= ABS_VSIZE. */ if (abs_usize != abs_vsize) { mpn_sub (wp, up, abs_usize, vp, abs_vsize); wsize = abs_usize; MPN_NORMALIZE (wp, wsize); if (usize < 0) wsize = -wsize; } else if (mpn_cmp (up, vp, abs_usize) < 0) { mpn_sub_n (wp, vp, up, abs_usize); wsize = abs_usize; MPN_NORMALIZE (wp, wsize); if (usize >= 0) wsize = -wsize; } else { mpn_sub_n (wp, up, vp, abs_usize); wsize = abs_usize; MPN_NORMALIZE (wp, wsize); if (usize < 0) wsize = -wsize; } } else { /* U and V have same sign. Add them. */ mp_limb_t cy_limb = mpn_add (wp, up, abs_usize, vp, abs_vsize); wp[abs_usize] = cy_limb; wsize = abs_usize + cy_limb; if (usize < 0) wsize = -wsize; } w->_mp_size = wsize;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -