Rechnen in BASH

Posted by admin on Aug 31, 2009 in Allgemein, Work Related |

Wehe man hat bc nicht installiert! Dann nicht weiterlesen. Du kannst sehen, ob Du bc installiert hast:

ls -alh /usr/bin/bc

Wenn es vorhanden ist, dann kann man so wunderbare Funktionen wie sqrt benutzen. Allerdings ist wieder etwas rumprobieren erforderlich, da man bc über echo füttert.

echo $(echo "$temp" | bc )

Das Echo in der Mitte übergibt $temp an bc. Das erste echo gibt den Inhalt der Klammer aus. Statt $temp kann da auch eine wilde Rechenoperation wie sqrt($temp) o.ä. drin stehen. Besonders wichtig:
Das(bc) ist die einzige Möglichkeit Fließkommazahlen / Floatingpointnumbers in der bash zu benutzen! Und weil Floatingpointnumbers im normalen Leben einer Bash keine Rolle spielen, muss man die Nachkommastelle wieder entfernen. Wie runden in der bash funktioniert, hab ich noch nicht rausgefunden, aber truncate geht mit:

TEMP=$(echo "sqrt($TARGETSIZE/($ROWS/$COLUMNS))" | bc -l)
NEWCOLUMNS=$(printf %.0f $TEMP)

Die zweite Zeile ist das Entfernend er Nachkommastelle.

UPDATE:
Wer Mathe kann, ist klar im Vorteil. An dieser Stelle ein “Danke” an Johannes für diese verblüffend einfach Lösung.

x=ganzzahlanteil(a+0,5)

Bissel drüber nachdenken und es ergibt sich von selbst. Das klappt natürlich nach diesem System([a*10^nachkommastelle+0,5]/10^nachkommastelle) auch für beliebige Nachkommastellen, nicht nur für die Erste.

Die Umsetzung in ein bash script ist dann einfach gewesen:

bash Script:

function round () {
echo $(printf %.$2f $(echo "scale=$2;(((10^$2)*$1)+0.5)/(10^$2)" | bc))
}

echo $(round 3.1234 2)
echo $(round 3.1271 2)

Ausgabe

3.12
3.13

Schlagwörter: ,

1 Comment

jj
Mai 11, 2012 at 16:20

geht es denn nun nur ums runden? wieso nicht einfach so:
printf %.2f .666 -> 0.67


 

Reply

OC

Copyright © 2018 Stempell All rights reserved. Theme by Laptop Geek.