2 * *****************************************************************************
4 * SPDX-License-Identifier: BSD-2-Clause
6 * Copyright (c) 2018-2023 Gavin D. Howard and contributors.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
11 * * Redistributions of source code must retain the above copyright notice, this
12 * list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above copyright notice,
15 * this list of conditions and the following disclaimer in the documentation
16 * and/or other materials provided with the distribution.
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
30 * *****************************************************************************
32 * The second bc math library.
39 if(y==a)return(x^a)@scale
49 if(p<scale(x)&&x-t>=5>>p+1)t+=1>>p
112 if(scale(x)>scale)scale=scale(x)
118 define l2(x){return log(x,2)}
119 define l10(x){return log(x,A)}
125 if(x==0||n==1)return x
126 if(n==2)return sqrt(x)
138 q=A^ceil((length(x$)/n)$,0)
147 define cbrt(x){return root(x,3)}
213 define sin(x){return s(x)}
214 define cos(x){return c(x)}
215 define atan(x){return a(x)}
216 define tan(x){return t(x)}
217 define atan2(y,x){return a2(y,x)}
244 define ifrand(i,p){return irand(abs(i)$)+frand(p)}
246 if(irand(2))return -x
249 define brand(){return irand(2)}
250 define void output(x,b){
257 define void hex(x){output(x,G)}
258 define void binary(x){output(x,2)}
263 for(p=1;i-1<x;p*=2){i*=i}
272 if(x>p||(!z&&x==p))n*=2
291 define s2u(x){return s2un(x,sbytes(x))}
293 if(leading_zero())print x
302 define void plznl(x){
324 define void pnlznl(x){
328 define void output_byte(x,i){
337 if(b>1)p=log(b,obase)+1
339 for(i=y-p;i>0;--i)print 0
343 define void output_uint(x,n){
351 define void hex_uint(x,n){
358 define void binary_uint(x,n){
365 define void uintn(x,n){
367 print"Error: ",x," is not an integer.\n"
371 print"Error: ",x," is negative.\n"
375 print"Error: ",x," cannot fit into ",n," unsigned byte(s).\n"
381 define void intn(x,n){
384 print"Error: ",x," is not an integer.\n"
388 if(abs(x)>=t&&(x>0||x!=-t)){
389 print "Error: ",x," cannot fit into ",n," signed byte(s).\n"
396 define void uint8(x){uintn(x,1)}
397 define void int8(x){intn(x,1)}
398 define void uint16(x){uintn(x,2)}
399 define void int16(x){intn(x,2)}
400 define void uint32(x){uintn(x,4)}
401 define void int32(x){intn(x,4)}
402 define void uint64(x){uintn(x,8)}
403 define void int64(x){intn(x,8)}
404 define void uint(x){uintn(x,ubytes(x))}
405 define void int(x){intn(x,sbytes(x))}
492 define bshl(a,b){return abs(a)$*2^abs(b)$}
493 define bshr(a,b){return(abs(a)$/2^abs(b)$)$}
509 define bnot8(x){return bnotn(x,1)}
510 define bnot16(x){return bnotn(x,2)}
511 define bnot32(x){return bnotn(x,4)}
512 define bnot64(x){return bnotn(x,8)}
513 define bnot(x){return bnotn(x,ubytes(x))}
523 define brev8(x){return brevn(x,1)}
524 define brev16(x){return brevn(x,2)}
525 define brev32(x){return brevn(x,4)}
526 define brev64(x){return brevn(x,8)}
527 define brev(x){return brevn(x,ubytes(x))}
537 x=divmod(x,2^(n-p),m[])
542 define brol8(x,p){return broln(x,p,1)}
543 define brol16(x,p){return broln(x,p,2)}
544 define brol32(x,p){return broln(x,p,4)}
545 define brol64(x,p){return broln(x,p,8)}
546 define brol(x,p){return broln(x,p,ubytes(x))}
561 define bror8(x,p){return brorn(x,p,1)}
562 define bror16(x,p){return brorn(x,p,2)}
563 define bror32(x,p){return brorn(x,p,4)}
564 define bror64(x,p){return brorn(x,p,8)}
565 define brol(x,p){return brorn(x,p,ubytes(x))}
570 x=abs(x)$%2^(abs(n)$*8)
574 define bmod8(x){return bmodn(x,1)}
575 define bmod16(x){return bmodn(x,2)}
576 define bmod32(x){return bmodn(x,4)}
577 define bmod64(x){return bmodn(x,8)}