Es sieht so aus, als ob bc keine Float-Operationen unterstützt. Wenn ich das tue echo 1/8 | bc
, bekomme ich eine Null.
Ich habe es überprüft bc (1)
, aber es wird nicht einmal erwähnt float
, also frage ich mich, ob es unterstützt wird.
Es sieht so aus, als ob bc keine Float-Operationen unterstützt. Wenn ich das tue echo 1/8 | bc
, bekomme ich eine Null.
Ich habe es überprüft bc (1)
, aber es wird nicht einmal erwähnt float
, also frage ich mich, ob es unterstützt wird.
Antworten:
bc
Fließkommazahlen werden nicht verwendet, es werden jedoch Dezimalzahlen mit fester Genauigkeit verwendet. Die -l
Flagge, die Hauke erwähnt, lädt eine Mathematikbibliothek für z. trig funktioniert aber es heißt auch
[...] die Standard - Skala ist 20
scale
ist eine von mehreren "Spezialvariablen", die in der Manpage erwähnt werden. Sie können es einstellen:
scale=4
Wann immer Sie wollen (ob -l
verwendet oder nicht). Es bezieht sich auf die Anzahl der signifikanten Stellen, die in einer Dezimalstelle verwendet werden . Mit anderen Worten, nachfolgende Lösungen werden auf diese Anzahl von Stellen nach der Dezimalskala gerundet (== feste Genauigkeit).
Die Standardskala ohne -l
ist 0, dh auf ganze Zahlen gerundet.
Manpage sagt:
Wenn bc mit der Option -l aufgerufen wird, ist eine Mathematikbibliothek vorinstalliert [...]
Die Verständlichkeit davon könnte in der Tat verbessert werden ...
1) Zahlen in bc haben eine Skala. Die Skala einer Zahl sollte nicht mit dem Skalierungsfaktor verwechselt werden. Dieselbe Welt-Skalierung wird als Funktion zum Abfragen der Skalierung einer Zahl oder als Parameter zum Festlegen des Skalierungsfaktors verwendet.
echo "scale=scale(1.1);11/10" | bc will return 1.1
2) Der Skalierungsfaktor bestimmt, wie viele Stellen bei Operationen rechts vom Dezimalpunkt stehen. Wenn s der aktuelle Skalierungsfaktor ist, sa die Skalierung des ersten Operanden a ist, sb die Skalierung des zweiten Operanden b ist, werden die Ergebnisse wie folgt gekürzt:
scale of result
a+b max(sa,sb)
a-b max(sa,sb)
a*b min(sa+sb , max(s,sa,sb))
a/b s
a%b so that a = b*quotient + remainder; remainder has sign of a
a^b min(sa×|b|, max(s,sa)); b must be integer
sqrt(a) max(s,sa)
3) Ursprünglich war bc ein Präprozessor von dc. Heute ist bc auf vielen Systemen ein eigenständiges Programm.
Quelle: [ https://plan9.io/magic/man2html/1/dc]
echo "scale=4; 1/8" | bc