Taschenrechner bc mit vorangesteller 0 bei Bruchwert

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
xcomm
Beiträge: 793
Registriert: 21.09.2003 05:12:01
Wohnort: Europe
Kontaktdaten:

Taschenrechner bc mit vorangesteller 0 bei Bruchwert

Beitrag von xcomm » 27.04.2014 16:34:39

Hallo Gemeinde.

der bc lässt bei solchen Ergebnissen wie 0.93 die 0 vor dem Komma weg.

Ergebnis: .93

Wie ging es nochmal, dass er das nicht tut?

Ergebnis: 0.93

Danke, xcomm

syssi
Beiträge: 2951
Registriert: 24.12.2010 16:50:59
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Rheinland

Re: Taschenrechner bc mit vorangesteller 0 bei Bruchwert

Beitrag von syssi » 27.04.2014 17:53:08

Mir gefallen diese Loesungen alle nicht: http://stackoverflow.com/questions/8402 ... ading-zero

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Taschenrechner bc mit vorangesteller 0 bei Bruchwert

Beitrag von Cae » 27.04.2014 17:54:32

Das ist ein bisschen komplizierter, aber offensichtlich auch innerhalb von bc(1) moeglich:

Code: Alles auswählen

for (x = 1.2; x > -1.3; x -= .3)
  if (0 < x && x < 1){ print "0"; x } else if (-1 < x && x < 0){ print "-0"; -x } else { x }
1.2
0.9
0.6
0.3
0
-0.3
-0.6
-0.9
-1.2
Im Grunde guckt man, ob da gemaess Zahlenbereich 'ne Null reingehoert und packt sie dazu.

Man koennte auch awk(1) nehmen und/oder nachschalten:

Code: Alles auswählen

$ echo 'a(1)' | bc -ql | awk '{printf(" %s\n%f\n%70.70f\n",$0,$0,$0)}'
 .78539816339744830961
0.785398
0.7853981633974482789994908671360462903976440429687500000000000000000000
Allerdings kommen da mehr oder minder heftige Rechenfehler bei raus (sind halt Gleitkommazahlen).
Interessanterweise kommt bei der internen Berechnung von pi/4 exakt dieselbe Zahl heraus:

Code: Alles auswählen

$ awk 'BEGIN{printf("%70.70f\n",atan2(1,1))}'
0.7853981633974482789994908671360462903976440429687500000000000000000000
Oben wurde sie noch auf dem bc(1)-Ergebnis herausexapoliert, was ist da los?!

Fazit: Seine Rechenergebnis bc-intern in x packen und per

Code: Alles auswählen

if (0 < x && x < 1){ print "0"; x } else if (-1 < x && x < 0){ print "-0"; -x } else { x }
ausgeben lassen (oder sich 'ne entsprechende Funktion bauen).

Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Antworten