Tämä on itse vastattu kysymys, Tutkimus, joka on kohtuullinen kysyä kysymystä, kuuluu vastausosaan. Älkää aliarvostako, koska uskotte, että en ole tutkinut tarpeeksi vastausta varten. Kiitos. Joka tapauksessa tällä sivustolla ei ole kuvausta (jonka löydän) tälle bc: n ominaisuudelle.
Kun käytetään bc, % -operaattorin väitetään laskevan ”loppuosan”, ja kyllä, se toimii kokonaisluvuille ja kun -asteikko on nolla :
$ bc <<<" scale=0; 27 % 7 " 6
Mutta se ei anna kokonaisluvun jäännöstä, jos asteikko ei ole nolla:
$ bc <<<" scale=10; 27 % 7 " .0000000003
Miksi (tai miten) tämä moduulin % määritelmä on hyödyllinen?
Vastaa
% -operaattori on selkeästi määritelty kohdassa bc käsikirja nimellä [a] :
# Internal % operator definition: define internalmod(n,d,s) { auto r,oldscale; oldscale=scale; r=n/d; s=max(s+scale(d),scale(n)); scale=s; r = n-(r)*d; scale=oldscale; return(r) }
Olettaen, että max on määritelty seuraavasti:
define max(x,y){ if(x>y){return(x)};return(y) }
Kuinka pitkä määritelmä on hyödyllinen?
-
Kokonaisluku .
I ”ll näyttää sekäinternalmod-funktio ja%-operaattorin tulokset osoittavat, että ne ovat vastaavia joillekin seuraaville operaatioille.Jos luvut ovat kokonaislukua, ja asteikko on asetettu arvoon 0, se on kokonaislukufunktio.
$ bc <<<"n=17; d=3; scale=0;a=internalmod(n,d,scale);b=n%d;print a," ",b,"\n"" 2 2 $ bc <<<"n=17; d=6; scale=0;a=internalmod(n,d,scale);b=n%d;print a," ",b,"\n"" 5 5
Se ei ole sama kuin matematiikan mod-funktio. Ratkaisen sen alla.
-
Desimaalijäämä.
Jos lukunon pidempi desimaaliluku, ja me muokkaamme asteikkoa, saamme:$ bc <<<"n=17.123456789;d=1; scale=0 ;a=internalmod(n,d,scale);b=n%d; print a," ",b,"\n"" .123456789 .123456789 $ bc <<<"n=17.123456789;d=1; scale=3 ;a=internalmod(n,d,scale);b=n%d; print a," ",b,"\n"" .000456789 .000456789Huomaa, että tässä kolme ensimmäistä desimaalilukua poistettiin ja loput annetaan neljännestä desimaaliluvusta.
$ bc <<<"n=17.123456789;d=1; scale=7 ;a=internalmod(n,d,scale);b=n%d; print a," ",b,"\n"" .000000089 .000000089Tämä osoittaa, että loput Tämä määritelmä tekee monipuolisemmaksi.
Nyt se on: loput mittakaavan arvo.
-
Skaalamuutos Mittakaavan muutos vaaditaan, koska luvulla
d(jakaja) voi olla enemmän desimaalilukuja kuinn. Tällöin lisää desimaaleja tarvitaan tarkemman tuloksen jakamiseksi:$ bc <<<"n=17.123456789; d=1.00000000001; scale=0; a=internalmod(n,d,scale); b=n%d; print a," ",scale(a)," -- ", b," ",scale(b),"\n"" .12345678883 11 -- .12345678883 11Ja jos asteikko muuttuu e:
$ bc <<<"n=17.123456789; d=1.00000000001; scale=5; a=internalmod(n,d,scale); b=n%d; print a," ",scale(a)," -- ", b," ",scale(b),"\n"" .0000067888287655 16 -- .0000067888287655 16Kuten yllä voidaan nähdä, asteikon arvo muuttuu siten, että se antaa kohtuullisen tarkan tuloksen jakamisesta mille tahansa arvolle
n,djascale.
I” Oletetaan, että internalmod – ja % -operaattorin vertailulla on molemmat osoitettu vastaaviksi.
-
iv Sekavuus . Ole varovainen, koska
d-arvon kanssa pelaaminen voi tulla hämmentäväksi:$ bc <<<"n=17.123456789; d=10; scale=3; a=n%d; print a," ",scale(a),"\n"" .003456789 9Ja:
$ bc <<<"n=17.123456789; d=1000; scale=3; a=n%d; print a," ",scale(a),"\n"" .123456789 9Eli:
d(yli 1) arvo muuttaa asetetun asteikon arvon vaikutusta.
Luultavasti d -arvojen, jotka ovat erilaiset kuin 1, arvo on oltava skaala = 0 (ellet todellakaan tiedä, mitä olet tekemässä).
-
Matematiikan mod .
Koska olemme niin syvällisesti sukeltaa mod-funktioihin, meidän on todennäköisesti selvitettävä%todellinen vaikutusbc-sivulla. BC: n%-operaattori käyttää ”katkaisevaa jakoa”. Yksi, joka pyörii kohti0. Tämä on tärkeäänja / taidnegatiivisten arvojen kannalta:$ bc <<<"scale=0; n=13; d=7; n%d; " 6 $ bc <<<"scale=0; n=13; d=-7; n%d; " 6Loppuosan merkki seuraa
dividend-merkkiä.$ bc <<<"scale=0; n=-13; d=7; n%d; " -6 $ bc <<<"scale=0; n=-13; d=-7; n%d; " -6Oikein math modin pitäisi antaa aina positiivinen loppuosa .
Saadaksesi (kokonaisluku) mod-funktion, käytä:
# Module with an always positive remainder (euclid division). define modeuclid(x,div) { if(div!=int(div)){ "error: divisor should be an integer ";return(0)}; return(x - div*int(x/div)) }Ja (sitten) tämä toimii:
$ bc <<<"n=7.123456789; d=5; modeuclid(34.123456789,7)" 6.123456789
[a]
lauseke% expr
Lausekkeen tulos on ”loppu” ja se lasketaan seuraavassa tapa. % B: n laskemiseksi ensin a / b lasketaan numeroiden skaalattavaksi.Tulosta käytetään laskemaan a- (a / b) * b asteikon suurimmalle asteikolle + asteikolle (b) ja asteikolle (a).
Jos asteikko on nolla ja molemmat lausekkeet ovat kokonaislukuja, tämä lauseke on kokonaisluvun loputoiminto.
bc -koodille, joka seuraa kohtaa, jossa tämä alaviite esitettiin toimimaan oikein, määritä aliakseksi:
$ alias bc="bc -l "$HOME/.func.bc""
Ja luo tiedosto nimeltä $HOME/.func.bc, joka sisältää ( ainakin):
# Internal % operator definition: define internalmod(n,d,s) { auto r,oldscale; oldscale=scale; r=n/d; s=max(s+scale(d),scale(n)); scale=s; r = n-(r)*d; scale=oldscale; return(r) } # Max function define max(x,y){ if(x>y){return(x)};return(y) } # Integer part of a number toward 0: -1.99 -> -1, 0.99 -> 0 define int(x) { auto os;os=scale;scale=0; x=sgn(x)*abs(x)/1;scale=os;return(x) } define sgn (x) { if (x<0){x=-1};if(x>0){x=1};return(x) }; define abs (x) { if (x<0) x=-x; return x }; # Module with an always positive remainder (euclid division). define modeuclid(x,div) { if(div!=int(div)){ "error: divisor should be an integer ";return(0)}; return(x - div*int(x/div)) }
Minkä tahansa numeron mod-funktio (kokonaisluku tai ei) voidaan määritellä seuraavasti:
# Module with an always positive remainder (euclid division). define modeuclid(x,div) { div=abs(div);return(x - div*floor(x/div)) } # Round down to integer below x (toward -inf). define floor (x) { auto os,y;os=scale;scale=0; y=x/1;if(y>x){y-=1};scale=os;return(y) };
Tämä määritelmä on täysin pätevä ja oikea matematiikkasääntöjen mukaan, mutta siitä saattaa tulla melko hämmentävä, kun yritetään soveltaa sitä todellisissa tilanteissa, vain sanomalla.