868b2b66 (kx 2024-12-20 16:11:07 +0300 1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2) # [Math Processor Unit Library (libmpu)](https://cgit.radix-linux.su/libs/libmpu.git/)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4) **libmpu** is a library of arithmetic functions for integer, real, and complex numbers of increased digit capacity.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6) ## Limitations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8) Arithmetic functions up to **65536** bits.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10) Trigonometric functions up to **16384** bits.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13) ## How to Build:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15) Clone the repository:
868b2b66 (kx 2024-12-20 16:11:07 +0300 16)
868b2b66 (kx 2024-12-20 16:11:07 +0300 17) ```Bash
868b2b66 (kx 2024-12-20 16:11:07 +0300 18) git clone https://git.radix-linux.su/libs/libmpu.git libmpu
868b2b66 (kx 2024-12-20 16:11:07 +0300 19) ```
868b2b66 (kx 2024-12-20 16:11:07 +0300 20)
868b2b66 (kx 2024-12-20 16:11:07 +0300 21) Bootstrap sources:
868b2b66 (kx 2024-12-20 16:11:07 +0300 22)
868b2b66 (kx 2024-12-20 16:11:07 +0300 23) ```Bash
868b2b66 (kx 2024-12-20 16:11:07 +0300 24) cd libmpu
868b2b66 (kx 2024-12-20 16:11:07 +0300 25)
868b2b66 (kx 2024-12-20 16:11:07 +0300 26) ./bootstrap
868b2b66 (kx 2024-12-20 16:11:07 +0300 27)
868b2b66 (kx 2024-12-20 16:11:07 +0300 28) cd ../
868b2b66 (kx 2024-12-20 16:11:07 +0300 29) ```
868b2b66 (kx 2024-12-20 16:11:07 +0300 30)
868b2b66 (kx 2024-12-20 16:11:07 +0300 31) Build the **MPU** library:
868b2b66 (kx 2024-12-20 16:11:07 +0300 32)
868b2b66 (kx 2024-12-20 16:11:07 +0300 33) ```Bash
868b2b66 (kx 2024-12-20 16:11:07 +0300 34) mkdir build
868b2b66 (kx 2024-12-20 16:11:07 +0300 35)
868b2b66 (kx 2024-12-20 16:11:07 +0300 36) cd build
868b2b66 (kx 2024-12-20 16:11:07 +0300 37)
868b2b66 (kx 2024-12-20 16:11:07 +0300 38) ../libmpu/configure \
868b2b66 (kx 2024-12-20 16:11:07 +0300 39) --prefix=/usr \
868b2b66 (kx 2024-12-20 16:11:07 +0300 40) --libdir=/usr/lib64 \
868b2b66 (kx 2024-12-20 16:11:07 +0300 41) --enable-static=no
868b2b66 (kx 2024-12-20 16:11:07 +0300 42)
868b2b66 (kx 2024-12-20 16:11:07 +0300 43) make
868b2b66 (kx 2024-12-20 16:11:07 +0300 44) make install
868b2b66 (kx 2024-12-20 16:11:07 +0300 45)
868b2b66 (kx 2024-12-20 16:11:07 +0300 46) cd ../
868b2b66 (kx 2024-12-20 16:11:07 +0300 47) ```
868b2b66 (kx 2024-12-20 16:11:07 +0300 48)
868b2b66 (kx 2024-12-20 16:11:07 +0300 49) ## Usage:
868b2b66 (kx 2024-12-20 16:11:07 +0300 50)
868b2b66 (kx 2024-12-20 16:11:07 +0300 51) Create directory:
868b2b66 (kx 2024-12-20 16:11:07 +0300 52)
868b2b66 (kx 2024-12-20 16:11:07 +0300 53) ```Bash
868b2b66 (kx 2024-12-20 16:11:07 +0300 54) mkdir -p tests/atan2
868b2b66 (kx 2024-12-20 16:11:07 +0300 55)
868b2b66 (kx 2024-12-20 16:11:07 +0300 56) cd tests/atan2
868b2b66 (kx 2024-12-20 16:11:07 +0300 57) ```
868b2b66 (kx 2024-12-20 16:11:07 +0300 58)
868b2b66 (kx 2024-12-20 16:11:07 +0300 59) Create Makefile:
868b2b66 (kx 2024-12-20 16:11:07 +0300 60)
868b2b66 (kx 2024-12-20 16:11:07 +0300 61) ```Makefile
868b2b66 (kx 2024-12-20 16:11:07 +0300 62) CC = gcc
868b2b66 (kx 2024-12-20 16:11:07 +0300 63)
868b2b66 (kx 2024-12-20 16:11:07 +0300 64) CFLAGS = `mpu-config cflags`
868b2b66 (kx 2024-12-20 16:11:07 +0300 65) LDFLAGS = `mpu-config --ldflags`
868b2b66 (kx 2024-12-20 16:11:07 +0300 66) LIBS = `mpu-config --libs` -lpthread
868b2b66 (kx 2024-12-20 16:11:07 +0300 67)
868b2b66 (kx 2024-12-20 16:11:07 +0300 68) SOURCES = main.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 69) OBJECTS = main.o
868b2b66 (kx 2024-12-20 16:11:07 +0300 70)
868b2b66 (kx 2024-12-20 16:11:07 +0300 71) all: main
868b2b66 (kx 2024-12-20 16:11:07 +0300 72)
868b2b66 (kx 2024-12-20 16:11:07 +0300 73) .SUFFIXES:
868b2b66 (kx 2024-12-20 16:11:07 +0300 74) .SUFFIXES: .o .c
868b2b66 (kx 2024-12-20 16:11:07 +0300 75) %.o : %.c
868b2b66 (kx 2024-12-20 16:11:07 +0300 76) $(CC) $(CFLAGS) -c -o $@ $<
868b2b66 (kx 2024-12-20 16:11:07 +0300 77)
868b2b66 (kx 2024-12-20 16:11:07 +0300 78) main: $(OBJECTS)
868b2b66 (kx 2024-12-20 16:11:07 +0300 79) $(CC) $(LDFLAGS) -o main $(OBJECTS) $(LIBS)
868b2b66 (kx 2024-12-20 16:11:07 +0300 80)
868b2b66 (kx 2024-12-20 16:11:07 +0300 81) clean:
868b2b66 (kx 2024-12-20 16:11:07 +0300 82) rm -f main *.o
868b2b66 (kx 2024-12-20 16:11:07 +0300 83) ```
868b2b66 (kx 2024-12-20 16:11:07 +0300 84)
868b2b66 (kx 2024-12-20 16:11:07 +0300 85) Create simple source code (main.c):
868b2b66 (kx 2024-12-20 16:11:07 +0300 86)
868b2b66 (kx 2024-12-20 16:11:07 +0300 87) ```C
868b2b66 (kx 2024-12-20 16:11:07 +0300 88) #include <libmpu.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 89) #include <stdio.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 90)
868b2b66 (kx 2024-12-20 16:11:07 +0300 91) int main( void )
868b2b66 (kx 2024-12-20 16:11:07 +0300 92) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 93) int rc = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 94)
868b2b66 (kx 2024-12-20 16:11:07 +0300 95) __mpu_init();
868b2b66 (kx 2024-12-20 16:11:07 +0300 96) __mpu_extra_warnings = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 97)
868b2b66 (kx 2024-12-20 16:11:07 +0300 98) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 99) mpu_real16384_t r, d;
868b2b66 (kx 2024-12-20 16:11:07 +0300 100) int nb = NB_R16384;
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) __mpu_char8_t s[6000]; /* size can be obtained by _real_max_string( NB_R16384 ) function */
868b2b66 (kx 2024-12-20 16:11:07 +0300 102)
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) ascii_to_real( r, "1.0", nb ); /* evaluate the R variable */
868b2b66 (kx 2024-12-20 16:11:07 +0300 104) ascii_to_real( d, "1.0", nb ); /* evaluate the D variable */
868b2b66 (kx 2024-12-20 16:11:07 +0300 105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 106) r_atan2( r, r, d, nb ); /* arc tangent function of R / D and place result to the R variable */
868b2b66 (kx 2024-12-20 16:11:07 +0300 107) real_to_ascii( s, r, _real_mant_digs(nb), 'E', 0, 0, nb ); /* convert R value to ASCII string S */
868b2b66 (kx 2024-12-20 16:11:07 +0300 108) printf( "s = %s\n\nrc = %d;\n", s, rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 109) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 110)
868b2b66 (kx 2024-12-20 16:11:07 +0300 111) __mpu_free_context();
868b2b66 (kx 2024-12-20 16:11:07 +0300 112)
868b2b66 (kx 2024-12-20 16:11:07 +0300 113) return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300 114) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 115) ```
868b2b66 (kx 2024-12-20 16:11:07 +0300 116)
868b2b66 (kx 2024-12-20 16:11:07 +0300 117) Build the **main** binary:
868b2b66 (kx 2024-12-20 16:11:07 +0300 118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 119) ```Bash
868b2b66 (kx 2024-12-20 16:11:07 +0300 120) make
868b2b66 (kx 2024-12-20 16:11:07 +0300 121) ```
868b2b66 (kx 2024-12-20 16:11:07 +0300 122)
868b2b66 (kx 2024-12-20 16:11:07 +0300 123) Run the **main** program:
868b2b66 (kx 2024-12-20 16:11:07 +0300 124)
868b2b66 (kx 2024-12-20 16:11:07 +0300 125) ```Bash
868b2b66 (kx 2024-12-20 16:11:07 +0300 126) ./main
868b2b66 (kx 2024-12-20 16:11:07 +0300 127) s = 7.853981633974483096156608458198757210492923498437764552437361480769541015715522496570087063355292669955370216283205766617734611523876455579313398520321202793625710256754846302763899111557372387325954911072027439164833615321189120584466957913178004772864121417308650871526135816620533484018150622853184311467516515788970437203802302407073135229288410919731475900028326326372051166303460367379853779023582643175914398979882730465293454831529482762796370186155949906873918379714381812228069845457529872824584183406101641607715053487365988061842976755449652359256926348042940732941880961687046169173512830001420317863158902069464428356894474022934092946803671102253062383575366373963427626980699223147308855049890280322554902160086045399534074436928274901296768028374999995932445124877649329332040240796487561148638367270756606305770633361712588154827970427525007844596882216468833020953551542944172868258995633726071888671827898907159705884468984379894454644451330428067016532504819691527989773041050497345238143002663714658197164840383454569920575754880088254632422489434056498534728124304438208697828788937143106135376739877073832792154319639722687745954386593662348298137651002319254177847524622060032145904008909269150261775454857388990497366919593623620638449436817117760118836615520116710647673728233284192572472880261880405142415060145095375483778133456075088969100618741183159785498181510674806991955886954090023354304103049811465787575715457436389266874596263736471467317489227318026993773257388302913362468006889900591201663747799704586994383915924518566356319656379546043936682227444431984500204117650040363122980433043036930875353604933921370403402893381380333689354623671096308309768485358336369406042156297458923713905248048055460681375635642219179476236504133667012471568081979465214460959569919941703635252384709465902376700160562813012793482462240210321221567364010604913212555526652965766860696555097987362617809284467402390910929793218669411643934906034727164581614989533476195068975248664410197378173670995881489274564556551306223519316798695671206503692477256600340986093638262670508740631129373499128578574522976648127343054241153789274645968526494714899432438747325404384821170345671709672356935389979639813114884898577624931311702114968184111739621634591840556565247811520128109710976128110341374406951994289228589994250324040223604237171389621015883555180564571221620396140071265042106848630668669197238130346306374886666819559966141490290887215576443641245088984086420435810281287690173698627741490235063072199277232864172842168071872351400253758271544821702302186902294562346472524287274189963153413874454732824462054207497371806647012143910035676193887830949103628809365585911357146111988164669552627853386839348807783567915255339923840578607381212342967775364413508975699836009355018276446347655495968619521196224208303614284671879858766075546132977621202513426536701687298195477994849880153549158571886101609362809295480449995977539798904536687856728099372352267966235579903919863020237866375563079009704825355234405344639891597344467707597674480193366805456406499153753553757670096119336373006513536664813003743607126831296665005331085220476776215829336624128634764490671402513770266646992495408936840960131428647757242660350277428015701097599398789192894251050844674840018076396907940898554682812867801332320479565465314668303947996037122072911176523938176739305229391779180727745422728820043376678187145805717958802338491431280270894787842470522861052516877583667775785316777842477164629099578754925412877921292859414404587889127212274974649955968363820829088769119796339733065463724080332332724642660511688147677288703541374648654092950677454985774811222393928207226480808315243249280211083933163723455977983149365916826459010357034707580095622593974631093604257283191404523443361007676867302800478255082595049405275275112323303790210611214909417459738071711957808881645532862394214315608360473259921606560852693306744507018297288602752611705813179050263163068027915099166393273136777639463440866705163277474131729655141192328142646589155046395251823401649691215294776133372125865284144216883123604170099066449469296390211382413531663521326535861079646692437864153517001750594694147836004281873676051405576347486403285177817501019636833174847703636661614701993177066707658582146964245763089522332664393516988642909438135505287389403953500625315571485325541178877448148077476991368440313794141878393794574166136947936252824903722576159986783240526835109379739339903647254847428277947607445714118758007996728785071770214976200273530368053294869119431556035637136350830392963265355720343962607658304379574496655592930397901929173136871847466637373625286635157108415984475099423164180365963266840241428022951909581791604068722200196731400725571180260079302965205104750105741542799094480334393778739875391512407965736816368410631E-1
868b2b66 (kx 2024-12-20 16:11:07 +0300 128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) rc = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) ```
868b2b66 (kx 2024-12-20 16:11:07 +0300 131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 132) **Enjoy**.