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 lukun
on 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 .000456789
Huomaa, 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 .000000089
Tä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 11
Ja 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 16
Kuten yllä voidaan nähdä, asteikon arvo muuttuu siten, että se antaa kohtuullisen tarkan tuloksen jakamisesta mille tahansa arvolle
n
,d
jascale
.
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 9
Ja:
$ bc <<<"n=17.123456789; d=1000; scale=3; a=n%d; print a," ",scale(a),"\n"" .123456789 9
Eli:
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ään
ja / taid
negatiivisten arvojen kannalta:$ bc <<<"scale=0; n=13; d=7; n%d; " 6 $ bc <<<"scale=0; n=13; d=-7; n%d; " 6
Loppuosan merkki seuraa
dividend
-merkkiä.$ bc <<<"scale=0; n=-13; d=7; n%d; " -6 $ bc <<<"scale=0; n=-13; d=-7; n%d; " -6
Oikein 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.