2014-12-14 9 views
6

Also versuche ich bc zu verwenden, um einige Logarithmen zu berechnen, aber ich muss es auch verwenden, um den Modul für etwas zu berechnen. Während ich mein Skript erstellte, startete ich bc, um es zu testen.bash, bc modulo funktioniert nicht mit -l flag

Ohne Flags gibt bc <<< "3%5" natürlich 3 zurück.

Aber mit bc -l (Lasten Mathematik-Bibliothek, so kann ich berechnen Logarithmen) jede Berechnung von a%b kehrt 0 wo a und b eine beliebige Zahl sein kann, aber 0.

Was passiert?

Antwort

11

Das liegt daran, aus dem Handbuch:

expr % expr 
      The result of the expression is the "remainder" and it is com‐ 
      puted in the following way. To compute a%b, first a/b is com‐ 
      puted to scale digits. That result is used to compute a-(a/b)*b 
      to the scale of the maximum of scale+scale(b) and scale(a). If 
      scale is set to zero and both expressions are integers this 
      expression is the integer remainder function. 

Wenn Sie bc mit der -l Flagge laufen, scale-20 gesetzt. Um dies zu beheben:

bc -l <<< "oldscale=scale; scale=0; 3%5; scale=oldscale; l(2)" 

Wir speichern erste scale in Variable oldscale, dann setzen Sie scale-0 auf einige arithmetische Operationen durchführen, und berechnen eine ln wir scale zurück auf seinen alten Wert gesetzt. Dies wird ausgegeben:

3 
.69314718055994530941 

wie gewünscht.

7

Nach der bc Hand

expr % expr 
      The result of the expression is the "remainder" and it is computed 
      in the following way. To compute a%b, first a/b is computed to 
      scale digits. That result is used to compute a-(a/b)*b to the 
      scale of the maximum of scale+scale(b) and scale(a). If scale is 
      set to zero and both expressions are integers this expression is 
      the integer remainder function. 

Also, was passiert ist, dass es a-(a/b)*b mit den aktuellen scale Einstellungen zu bewerten versucht. Der Standardwert scale ist 0, also erhalten Sie den Rest. Wenn Sie bc -l ausführen, erhalten Sie scale=20 und der Ausdruck a-(a/b)*b wertet 0 aus, wenn 20 Nachkommastellen verwenden.

Um zu sehen, wie es funktioniert, einige andere Fraktionen versuchen:

$ bc -l 
1%3 
.00000000000000000001 

Um eine lange Geschichte kurz zu machen, vergleichen, nur drei Ausgänge:

Standard scale mit -l aktiviert (20):

Lassen Sie scale auf 1 setzen:

scale=1 

3%5 
0 

1%4 
.2 

oder auf Null (Standard ohne -l):

scale=0 

3%5 
3 

1%4 
1 
2

Mann bc:

Wenn bc mit der Option -l aufgerufen wird, wird eine mathematische Bibliothek vorbelastet und die Standard-Skala ist auf 20 eingestellt.

Vielleicht sollten Sie die Skala auf 0 gesetzt:

#bc 
scale=0 
10%3 
1 
3

Sie können eine Funktion definieren, die vorübergehend in Mathematik-Modus arbeitet, indem scale auf Null.

Ich habe bc wie diese Alias:

alias bc='bc -l ~/.bcrc' 

So ~/.bcrc vor allen anderen Ausdrücke ausgewertet, so dass Sie Funktionen in ~/.bcrc definieren können. Zum Beispiel kann ein Modul Funktion:

define mod(x,y) { 
    tmp = scale 
    scale = 0 
    ret = x%y 
    scale = tmp 
    return ret 
} 

Jetzt können Sie tun Modulo wie folgt aus:

echo 'mod(5,2)' | bc 

Ausgang:

1