====== Pi per Skript berechnen ====== Es ist möglich eine Annäherung von Pi mit dem ArkusTangens zu berechnen. Vier mal der ArkusTangens von 1 entspricht in etwa Pi. > echo "scale=10; 4*a(1)" | bc -l 3.1415926532 ==== Rechengrundlage aus Wikipedia ==== #!/bin/bash #------------------------------------------------------------------------------# # # Pi # # Wikipedia # #------------------------------------------------------------------------------# if [ "$(uname -s)" = "FreeBSD" ] ; then B="tail -r" elif [ "$(uname -s)" = "Linux" ] ; then B="tac" else echo "Dieses System wird nicht unterstützt" exit 1 fi echo "3; 7, 15, 1, 292, 1, 1, 1, 2, 1, 3, 1, 14, 2, 1, 1, 2, 2, 2, 2, 1, 84, 2, 1, 1, 15, 3, 13, 1, 4, 2, 6, 6, 99, 1, 2, 2, 6, 3, 5, 1, 1, 6, 8, 1, 7, 1, 2, 3, 7, 1, 2, 1, 1, 12, 1, 1, 1, 3, 1, 1, 8, 1, 1, 2, 1, 6, 1, 1, 5, 2, 2, 3, 1, 2, 4, 4, 16, 1, 161, 45, 1, 22, 1, 2, 2, 1, 4, 1, 2, 24, 1, 2, 1, 3, 1, 2, 1, 1, 10, 2, 5, 4, 1, 2, 2, 8, 1, 5, 2, 2, 26, 1, 4, 1, 1, 8, 2, 42, 2, 1, 7, 3, 3, 1, 1, 7, 2, 4, 9, 7, 2, 3, 1, 57, 1, 18, 1, 9, 19, 1, 2, 18, 1, 3, 7, 30, 1, 1, 1, 3, 3, 3, 1, 2, 8, 1, 1, 2, 1, 15, 1, 2, 13, 1, 2, 1, 4, 1, 12, 1, 1, 3, 3, 28, 1, 10, 3, 2, 20, 1, 1, 1, 1, 4, 1, 1, 1, 5, 3, 2, 1, 6, 1, 4" \ | tr -s '[;,]' '\n' \ | ${B} \ | while read ZAHL do if [ -z "${FORMEL}" ] ; then FORMEL="${ZAHL}" else FORMEL="(${ZAHL}+1/${FORMEL})" fi echo "${FORMEL}" done | tail -n1 | sed -e 's/.*/scale=201;&/' | bc -l > ~/bin/Pi_Wikipedia.sh 3.141592653589793238462643383279502884197169399375105820974944592307\ 81640628620899862803482534211706798214808651328230664709384460955058\ 2231725359408128481117450284102701938521105559644622948954930381958 ===== Pi berechnen ===== #!/bin/bash #------------------------------------------------------------------------------# # # Pi berechnen # # https://youtu.be/d-o3eB9sfls # # Es erfolgt nur eine einzige Berechnung, # dabei ist die max. Länge der Aufgabe zu beachten, # die bei Verwendeung von "bc" 1000 Elemente nicht überschreiten darf. # #------------------------------------------------------------------------------# #VERSION="v2020110100" VERSION="v2020110200" #------------------------------------------------------------------------------# # Pi²/6 = 1/1² + 1/2² + 1/3² + 1/4² + 1/5² + 1/6² + 1/7² + 1/8² + 1/9² + 1/10² + ... # 997 ist bei Verwendung von "bc" das Maximum ANZAHL='997' for NR in $(seq 1 ${ANZAHL}) do if [ "x${AUFGABE}" = "x" ] ; then AUFGABE="1/${NR}^2" else AUFGABE="${AUFGABE} + 1/${NR}^2" fi done echo " # Pi berechnen Kettenbruch mit ${ANZAHL} Elementen:" echo "Pi²/6 = ${AUFGABE}" | cut -b-80 PI26="$(echo "${AUFGABE}" | bc -l)" PI="$(echo "sqrt (${PI26} * 6)" | bc -l)" echo "Pi = ${PI}" unset ANZAHL unset AUFGABE #------------------------------------------------------------------------------# > ~/bin/Pi_1.sh # Pi berechnen Kettenbruch mit 997 Elementen: Pi²/6 = 1/1^2 + 1/2^2 + 1/3^2 + 1/4^2 + 1/5^2 + 1/6^2 + 1/7^2 + 1/8^2 + 1/9^2 + Pi = 3.14063518479926959476 #!/bin/bash #------------------------------------------------------------------------------# # # Pi berechnen # # https://youtu.be/d-o3eB9sfls # # Um in der max. Aufgabenlänge nicht weiter beschränkt zu sein, werden die # Teilaufgaben bereits berechnet. # Das hat zur Folge, dass die gesamte Berechnung deutlich länger dauert # und dass das Limit jetzt die Größe des Ergebnisses ist. # #------------------------------------------------------------------------------# VERSION="v2020110200" if [ "x${1}" == x ] ; then echo "${0}" echo "${0} [Anzahl der Kettenbrüche in der Aufgabe]" echo "${0} 21" exit 123 else ANZAHL="${1}" fi #------------------------------------------------------------------------------# # Pi²/6 = 1/1² + 1/2² + 1/3² + 1/4² + 1/5² + 1/6² + 1/7² + 1/8² + 1/9² + 1/10² + ... for NR in $(seq 1 ${ANZAHL}) do if [ "x${AUSGABE}" = "x" ] ; then AUSGABE="$(echo "1/${NR}^2" | bc -l)" else AUSGABE="$(echo "${AUSGABE} + 1/${NR}^2" | bc -l)" fi done echo "sqrt (${AUSGABE} * 6)" | bc -l #------------------------------------------------------------------------------# Laufzeit ca. 8 Minuten (also "mehr Geduld"...): > ~/bin/Pi_2.sh 100000 3.14158310432644048375 **Es geht auch noch etwas genauer...** #!/bin/bash #------------------------------------------------------------------------------# # # Pi generieren # # https://youtu.be/d-o3eB9sfls # # Um in der max. Aufgabenlänge nicht weiter beschränkt zu sein, werden die # Teilaufgaben bereits berechnet. # Das hat zur Folge, dass die gesamte Berechnung deutlich länger dauert # und dass das Limit jetzt die Größe des Ergebnisses ist. # # Zusätzlich kann die Rechengenauigkeit von "bc" hier eingestellt werden. # #------------------------------------------------------------------------------# VERSION="v2020110200" GENAUIGKEIT="64" #GENAUIGKEIT="256" if [ "x${1}" == x ] ; then echo "${0}" echo "${0} [Anzahl der Kettenbrüche in der Aufgabe]" echo "${0} 21" exit 123 else ANZAHL="${1}" fi #------------------------------------------------------------------------------# # Pi²/6 = 1/1² + 1/2² + 1/3² + 1/4² + 1/5² + 1/6² + 1/7² + 1/8² + 1/9² + 1/10² + ... for NR in $(seq 1 ${ANZAHL}) do if [ "x${AUSGABE}" = "x" ] ; then AUSGABE="$(echo "1/${NR}^2" | sed -e "s/.*/scale=${GENAUIGKEIT};&/" | bc -l)" else AUSGABE="$(echo "${AUSGABE} + 1/${NR}^2" | sed -e "s/.*/scale=${GENAUIGKEIT};&/" | bc -l)" fi done echo "sqrt (${AUSGABE} * 6)" | sed -e "s/.*/scale=${GENAUIGKEIT};&/" | bc -l #------------------------------------------------------------------------------# Laufzeit ca. 8 Minuten (also "Geduld"...): > ~/bin/Pi_3.sh 100000 3.1415831043264409590369262630429532262094360645083129709541933516