Float betrieb mit bc?


42

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.


9
echo "scale=4; 1/8" | bc
LiuYan 刘 研

Diese Frage und insbesondere die akzeptierte Antwort könnte Sie interessieren.
Emanuel Berg

Antworten:


56

bcFließkommazahlen werden nicht verwendet, es werden jedoch Dezimalzahlen mit fester Genauigkeit verwendet. Die -lFlagge, die Hauke ​​erwähnt, lädt eine Mathematikbibliothek für z. trig funktioniert aber es heißt auch

[...] die Standard - Skala ist 20

scaleist eine von mehreren "Spezialvariablen", die in der Manpage erwähnt werden. Sie können es einstellen:

scale=4

Wann immer Sie wollen (ob -lverwendet 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 -list 0, dh auf ganze Zahlen gerundet.


27

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 ...


14
Melden Sie es als Bug Upstream ...
vonbrand

0

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]

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.