kommazahlen in script berechnen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

kommazahlen in script berechnen

Beitrag von manes » 16.01.2010 12:18:07

hallo forum,

für eine kleine statistische übung wollte ich einen einzeiler schreiben, aber unter der bash funktioniert das nur für ganze zahlen und bringt ansonsten falsche ergebnisse oder fehlermeldungen.

Code: Alles auswählen

#!/bin/bash
echo "Wie groß sollte unter bestimmten Bedingungen die Stichprobe der Untersuchung sein? Gib bitte die folgenden Daten ein!"
read -p "Größe der Grundgesamtheit N: " N
read -p "Breite des Konfidenzintervalls e: " e
read -p "Größe des Stichprobenanteils p: " p
read -p "Standardnormalverteilung Z: " Z
echo "Die Stichprobe sollte etwa" $(((((Z*Z)*p*(1-p))/(e*e))/(1+(((((Z*Z)*p*(1-p))/(e*e))-1)/N)))) "Personen umfassen"
offenbar muß ich auf Debianbc zurückgreifen, aber dessen syntax verstehe ich leider garnicht. hat jemand einen tip für mich, wie ich die bc für obenstehende formel benutzen kann?
merci im vorabbereich!
manes

edit: typo
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: kommazahlen in script berechnen

Beitrag von GoKi » 16.01.2010 12:27:46

Auf die Schnelle:

Code: Alles auswählen

#!/bin/bash
echo "Wie groß sollte unter bestimmten Bedingungen die Stichprobe der Untersuchung sein? Gib bitte die folgenden Daten ein!"
read -p "Größe der Grundgesamtheit N: " N
read -p "Breite des Konfidenzintervalls e: " e
read -p "Größe des Stichprobenanteils p: " p
read -p "Standardnormalverteilung Z: " Z
n=$(echo "scale = 7; ((((($Z*$Z)*$p*(1-$p))/($e*$e))/(1+((((($Z*$Z)*$p*(1-$p))/($e*$e))-1)/$N))))" | bc)
echo "Die Stichprobe sollte etwa $n Personen umfassen"
MfG GoKi
:wq

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: kommazahlen in script berechnen

Beitrag von manes » 16.01.2010 12:42:57

:THX: danke Goki, es funktioniert. auch wenn ich es auf den ersten blick noch nicht kapiere... :roll:
manes
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: kommazahlen in script berechnen

Beitrag von Meillo » 16.01.2010 13:02:06

Bei bc müssen Variablennamen in Kleinbuchstaben sein. Wenn du das berücksichtigst kannst du die Formel 1:1 übernehmen. Allerdings darfst du nicht vergessen bc mit -l zu starten, sonst rechnet er nur in Ganzzahlen (oder gibt nur Ganzzahlen aus -- eines von beiden).

Ansonsten ist awk eine gute Wahl für Gleitkommaarithmetik.
Use ed once in a while!

Benutzeravatar
manes
Beiträge: 958
Registriert: 27.08.2007 11:26:54
Wohnort: Köln
Kontaktdaten:

Re: kommazahlen in script berechnen

Beitrag von manes » 17.01.2010 14:14:38

Meillo hat geschrieben:Bei bc müssen Variablennamen in Kleinbuchstaben sein. (...) bc mit -l zu starten, sonst rechnet er nur in Ganzzahlen (oder gibt nur Ganzzahlen aus -- eines von beiden).Ansonsten ist awk eine gute Wahl für Gleitkommaarithmetik.
hier irrt der meister! nach GoKis vorlage berechnet bc auch ohne option -l und ohne kleinbuchstaben korrekte ergebnisse und gibt auch nicht nur ganzzahlige ergebnisse aus. und ich hab mir die "softwareschätze" vom ulm.ccc.de angetan und war auch selber angetan, aber bei awk wars mit meiner konzentration vorbei. aber danke auch dafür!
manes
Sometimes you have a programming problem and it seems like the best solution is to use regular expressions; now you have two problems.
David Mertz

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: kommazahlen in script berechnen

Beitrag von GoKi » 17.01.2010 14:36:42

Das mit den Variablen stimmt schon. Nur sieht bc bei meiner Variante die Variablen nicht mehr. Diese werden durch echo expandiert und als Zeichenkette in bc eingelesen.

Die Option -l hat den Effekt, dass direkt ein scale gesetzt wird (scale = 20), also mit Nachkommazahlen berechnet wird. Für die einfache Formel oben brauchen wir aber ansonsten keine Funktionen aus der Math-Library.
MfG GoKi
:wq

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: kommazahlen in script berechnen

Beitrag von Meillo » 17.01.2010 14:44:08

manes hat geschrieben:
Meillo hat geschrieben:Bei bc müssen Variablennamen in Kleinbuchstaben sein. (...) bc mit -l zu starten, sonst rechnet er nur in Ganzzahlen (oder gibt nur Ganzzahlen aus -- eines von beiden).Ansonsten ist awk eine gute Wahl für Gleitkommaarithmetik.
hier irrt der meister! nach GoKis vorlage berechnet bc auch ohne option -l und ohne kleinbuchstaben korrekte ergebnisse und gibt auch nicht nur ganzzahlige ergebnisse aus.
Das mit den Gleitkommazahlen liegt an `scale', das ich noch nicht kannte. Hatte bisher immer -l gewählt, dann ist scale automatisch gesetzt.

Bei den Kleinbuchstaben ändert GoKi nichts an der von mir beschriebenen Situation. Wenn du genau hinschaust sorgt er dafür, dass bc gar keine Variablen zu sehen bekommt. Stattdessen werden von der Shell alle Werte direkt eingesetzt und bc berechnet nur noch den Ausdruck (der keine Variablen mehr enthält).

[EDIT: Da war GoKi schon schneller.]

und ich hab mir die "softwareschätze" vom ulm.ccc.de angetan und war auch selber angetan, aber bei awk wars mit meiner konzentration vorbei. aber danke auch dafür!
Freut mich, dass dir der Vortrag gefallen hat.

In awk würde man es beispielsweise so machen:

Code: Alles auswählen

awk 'BEGIN { Z='$Z'; p='$p'; e='$e'; N='$N'; print ((((Z*Z)*p*(1-p))/(e*e))/(1+(((((Z*Z)*p*(1-p))/(e*e))-1)/N))) }'
Use ed once in a while!

Antworten