BC - automatische Multiplikation mit voller Genauigkeit

10

Hoch, ich muss meinen willkürlichen Präzisionsrechner testen und bcscheint ein guter Maßstab zum Vergleich zu sein, bcschneidet jedoch das Ergebnis jeder Multiplikation auf die scheinbar maximale Skala der beteiligten Operanden ab.

Gibt es eine schnelle Möglichkeit, dies auszuschalten oder die Skala jeder Multiplikation automatisch auf die Summe der Skalen der Faktoren einzustellen, damit sie nicht an Genauigkeit verliert?

Wenn Sie eine elegantere Lösung für dieses Problem haben, die etwas anderes beinhaltet als bc, würde ich es begrüßen, wenn Sie es teilen.

Beispiel:

$ bc <<< '1.5 * 1.5'
2.2

Die wirkliche Antwort ist 2.25.

PSkocik
quelle
Eng verwandt mit dem Float-Betrieb mit bc? .
Manatwork

Antworten:

12

Sie können die Skalierung steuern, die bcmit dem scale=<#>Argument ausgegeben wird.

$ echo "scale=10; 5.1234 * 5.5678" | bc
28.52606652

$ echo "scale=5; 5.1234 * 5.5678" | bc
28.52606

Anhand Ihres Beispiels:

$ bc <<< 'scale=2; 1.5 * 1.5'
2.25

Sie können auch den -lSchalter verwenden (dank @manatwork), der die Skalierung auf 20 anstatt auf den Standardwert 0 initialisiert. Beispiel:

$ bc -l <<< '1.5 * 1.5'
2.25

$ bc -l <<< '1.52 * 1.52'
2.3104

Weitere Informationen finden Sie scalein der bcManpage .

slm
quelle
5
Oder kürzer : bc -l. " -L (Der Buchstabe ell.) Definieren Sie die mathematischen Funktionen und initialisieren Sie die Skalierung auf 20 anstelle der Standard-Null" - bcSpezifikation
Manatwork
@manatwork - danke, habe diesen Schalter nicht bemerkt.
slm
Vielen Dank. Ich denke, ich könnte die Skalierung auf 2147483647 einstellen (was zufällig gleich INT_MAX ist), was mir sagt, dass dies der maximale Skalierungswert ist, den ich einstellen kann (ich bin in meinen Tests so weit weg), aber ich werde es erraten Ich werde es nur mit ganzen Zahlen testen und bc die Leistungsvorteile geben, die sich aus der Verwendung von Zahlen mit dynamischer Länge ergeben.
PSkocik
1
Für die bc-Multiplikation ist die Skala des Ergebnisses genau min(max(sx,sy,scale),sx+sy)dort , wo sxund sysind die Skalen von xund yin x*y. Die Einstellung scale=scale(x)+scale(y)bietet die maximal erforderliche Präzision. Wenn Sie die Skalierung auf eine höhere Zahl (wie 1000) einstellen, wird die Skalierung des Ergebnisses nicht erhöht. Die Skalierungsvariable wirkt sich nur direkt auf s aus. Das Ergebnis der Division scale=1000; a/1erzeugt ein Ergebnis mit 1000 Dezimalstellen (nach dem Punkt), unabhängig von der vorherigen Skalierung von a.
Isaac
1

Versuche dies :

$ bc
scale=10
1.5 * 1.5
2.25

Durchsuche den Mann von bc nach einer Skalenvariablen

DavAlPi
quelle
0

Ich habe diese Bash-Funktion erstellt, die keine nachgestellten Nullen anzeigt

calc () { MAX_PRECISION=20; bc <<< "scale=$MAX_PRECISION; scale = scale($@); $@"; }

Beispiel: calc 1.25^3= 1,953125

Vartan
quelle