Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Berechnen auf nahezu beliebige Kommastellen nur mit Batch (30000 Stellen getestet)

Tipp Entwicklung Batch & Shell

Mitglied: Apop85

Apop85 (Level 1) - Jetzt verbinden

12.04.2013, aktualisiert 19.04.2013, 5818 Aufrufe, 6 Kommentare, 2 Danke

Hey zusammen. Hab da mich bezügl. diesem Thema auch umgeschaut hier. Die meisten benutzten zur Lösung ein VB-Script o.ä.
Habe hier mal was zurechtgebastelt anhand dem was ich in der Grundschule gelernt habe... von Kopf dividieren. Eine stelle nach der anderen...

Damits auch lustig wird habe ich mal ein Batch geschrieben der eine gerundete Zahl von PI auf undefinierte länge in ein txt ausspuckt. Ganz nach der Grundschulmethode berechnet.

Hab schon viel gelesen über das Thema und meist hiess es einfach es gehe nicht(Unpassendes Werkzeug für Aufgabe). Natürlich sind auch die netten VBS-4-Zeiler ganz nett und auch effizienter, ich dachte mir jedoch, dass es irgendwie auch so gehen sollte.
Und Voila:

01.
@echo off & setlocal 
02.
set vorkomma1=49932 & set vorkomma2=15893 
03.
set nachkomma1=159 & set nachkomma2=900 
04.
set /a vorkomma1=%vorkomma1%*1000 
05.
set /a vorkomma2=%vorkomma2%*1000 
06.
set /a nenner=%vorkomma1%+%nachkomma1% 
07.
set /a teiler=%vorkomma2%+%nachkomma2% 
08.
set timer=0 
09.
set div1=0 
10.
echo Auf wieviele Stellen soll gerechnet werden? 
11.
set /p stellen= 
12.
set /a stellen=%stellen%+1 
13.
:HOME 
14.
set /a timer=%timer%+1 
15.
echo Berechnung Kommastelle:%timer% 
16.
if %timer% == %stellen% goto DONE 
17.
set /a div0=%nenner%/%teiler% 
18.
if %div0% == 0 (  
19.
	set "zahl=0" & set "div1=0" 
20.
	) else (  
21.
	set zahl=%div0% & set /a div1=%div0%*%teiler% 
22.
23.
 
24.
if %div1% GEQ 1 ( set /a nenner=%nenner%-%div1% ) 
25.
set /a nenner=%nenner%*10 
26.
 
27.
if %timer% LEQ 1 set "zahl=%zahl%." 
28.
<nul set/p"%zahl%" >>Ausgabe.txt 
29.
goto HOME 
30.
 
31.
:DONE 
32.
set /a stellen=%stellen%-1 
33.
echo Die Division wurde auf %stellen% Nachkommastellen berechnet. 
34.
ping -n 10 localhost >NUL 
35.
exit
Erklärung:

Er überprüft ob die Zahl A (%nenner%) geteilt durch B (%teiler%) 0 ergibt (Zeile 18) und wenn dies so ist setzt er die Variable C (%zahl%) welche in das Resultat einfliesst auf 0 (Zeile 19) und Spring zum Schluss wo er die Ursprüngliche Variable A, sollte C = 0 sein, multipliziert mit 10. Danach wird das ganze wiederholt bis die gewünschte Kommastelle erreicht ist.

Sollte nun aber die Division von A durch B nicht 0 sein so setzt er die Variable C als Resultatschnippsel (%zahl%) danach multipliziert das Script die Variable C mit der Variable B (Zeile 21) und zieht dieses Resultat wieder der Variable A ab (Zeile 24). (Komplizierte schreibweise für die Division auf dem Blatt)
http://de.wikipedia.org/wiki/Schriftliche_Division

Ich versuch das mal bildlich darzustellen. Dividieren von Hand im zusammenhang mit diesem Beitrag:
01.
-- Also Man nehme wie z.B. in diesem Beispiel eine dreistellige Zahl -- 
02.
Zu Teilende Zahl = 49932.195 / Teiler = 123.456 
03.
-- Diese wird anhand des Punktes in zwei Variablen aufgeteilt -- 
04.
   a = 49932 
05.
   b = 195 
06.
-- Dann wird a x 1000 gerechnet, sozusagen um die Kommastellen weg zu multiplizieren -- 
07.
   a x 1000 = 49932000 
08.
   c = a + b 
09.
-- c ist nun die Gesammte zu Dividierende Zahl. Das selbe Schema widerholen wir auch beim Dividend (d), also der Zahl durch die c geteilt werden soll -- 
10.
c : d = 
11.
49932195 : 123456    = 404 - Rest 55776  <-- 1. Variabel = 404 
12.
   557760 : 123456   = 4   - Rest 63936  <-- 2. Variabel = 4 
13.
    639360 : 123456  = 5   - Rest 22080  <-- 3. Variabel = 5 
14.
     220800 : 123456 = 1   - Rest 97344  <-- 4. Variabel = 1 
15.
usw...
-- Jetzt hat man schon auf 3 Kommastellen berechnet --
Die Ausgabe kann in eine Datei geschehen so wie in meinem Beispiel oben oder aber man macht folgendes:
01.
if defined Resultat (  
02.
    set "Resultat=%Resultat%%Zahl%"  
03.
    ) else ( 
04.
    set "Resultat=%Zahl%" 
05.
06.
echo %Resultat%  
Warum Multipliziere ich die Zahlen am Anfang mit 1000?
Dies mache ich weil Dos ja bekanntlich keine Kommastellen von alleine rechnen kann. Also wenn ich z.B. 1.123 habe steht 1 für %vorkomma1% und und 123 für %nachkomma1%. Durch die Multiplikation kann ich nun die beiden zusammenrechnen zu 1123 perfekt also für die Division (Da Dos ja nur ganze Zahlen schluckt)
Möchte man jetzt mehr Nachkommastellen so muss man pro Kommastelle die Multiplikation um 10 erhöhen. Aber achtung Dos bringts nur bis Summen von +/- 200'000'000 höher rechnet es nicht. Daher habe ich auch eine Schleife gemacht wo die Kommastellen im 6er-Pack berechnet werden.
01.
set /a vorkomma1=%vorkomma1%*1000 
02.
set /a vorkomma1=%nachkomma1%+%vorkomma1%
Was man bei einer Umsetzung zu einem Taschenrechner beachten muss, ist dass nicht alle immer 1.100 eingeben um mit 1.1 zu rechnen. Ausserdem kann er dann 1.1 und 1.001 nicht unterscheiden beides ergibt bei seiner Rechnung 1001 ((vorkomma x 1000)+nachkomma)

Ich hab dies folgendermassen gelöst:
01.
 
02.
for /f "delims=. tokens=1-2" %%a in ("%nenner%") do ( 
03.
				Set "=vorkomma1%%a" 
04.
				Set "^nachkomma1=%%b" 
05.
06.
 
07.
 
08.
for /f "delims=. tokens=1-2" %%a in ("%teiler%") do ( 
09.
				Set "vorkomma2=%%a" 
10.
				Set "nachkomma2=%%b" 
11.
)
Somit teilt er schon mal auf in Vor- und Nachkommastelle des Nenners und dem Teiler.

nun überprüft man die Eingabe
01.
if "%nachkomma1:~1,1%" == "" set "nachkomma1=%nachkomma1%0" 
02.
if "%nachkomma2:~1,1%" == "" set "nachkomma2=%nachkomma2%0" 
03.
if "%nachkomma1:~2,1%" == "" set "nachkomma1=%nachkomma1%0" 
04.
if "%nachkomma2:~2,1%" == "" set "nachkomma2=%nachkomma2%0"
So ergänzt er die Eingabe 1.1 auf 1.100. Somit rechnet er wieder mit 1100 und nicht mit 1001.
Dies kann mann auch als rechenvorlage benutzen für einen kleinen Rechner.

Lg.

Apop

Auf Wunsch noch der "VBS-4-Zeiler" den ich gefunden hab. made by @bastla
gefunden auf http://www.administrator.de/frage/batch-dividieren-mit-kommastelle-8125 ...
01.
@echo off & setlocal 
02.
set Zahl1=120 
03.
set Zahl2=13 
04.
set Stellen=2 
05.
 
06.
set R=%temp%\Rechne.vbs 
07.
echo Set a=WScript.Arguments:WScript.Echo FormatNumber(Eval(a(0)),a(1))>%R% 
08.
for /f %%i in ('cscript //nologo %R% "%Zahl1%/%Zahl2%" %Stellen%') do set Ergebnis=%%i 
09.
echo %Ergebnis%
Mitglied: 106543
12.04.2013 um 13:56 Uhr
Hi,

nett wärst du so lieb und würdest mir auch mal so einen VBS 3-Zeiler posten ?

Grüße
Exze
Bitte warten ..
Mitglied: Apop85
12.04.2013, aktualisiert um 17:19 Uhr
Hey.

Ich editier ihn noch rein wenn ich ihn wieder finde... Hab in letzter Zeit viel Recherchiert und weiss auch nicht mehr genau was ich wo gefunden habe

(p.s. 4 Zeilen sind nur ne schätzung... Jedenfalls massiv weniger als 193 Zeilen , die Erinnerungen an den Eintrag sind Verschleiert )

Weiss zufällig jemand eine Lösung wie ich das mit der Ausgabe in eine Einzige zeile fertigkriege?


Gruss
Apop

<edit>
VBScript wurde zum Haubtbeitrag hinzugefügt
</edit>
Bitte warten ..
Mitglied: Endoro
12.04.2013 um 18:56 Uhr
Hallo Apop85,

Zitat von Apop85:
Weiss zufällig jemand eine Lösung wie ich das mit der Ausgabe in eine Einzige zeile fertigkriege?

geht so:
01.
<nul set/p"=XXX "
Leerzeichen zwischen "=" und dem ersten Buchstaben werden nur in XP dargestellt, nicht in Vista oder später. Die Leerzeichen also an den Text anhängen, wie das in meinem Beispiel.

Gruss!
Bitte warten ..
Mitglied: Apop85
12.04.2013 um 23:52 Uhr
Sorry versteh nicht ganz was das macht.
In welchem Kontext kommt das? Hab schon versucht rubzubasteln indem ich NUL durch Dateinamen austausche oder xxx als %zahl% nehm

geht so:
01.
<nul set/p"=XXX "
Leerzeichen zwischen "=" und dem ersten Buchstaben werden nur in XP dargestellt, nicht in Vista oder später. Die

evtl. könntest du mir das etwas näher erläutern.

Danke & Gruss
Bitte warten ..
Mitglied: rubberman
13.04.2013, aktualisiert um 15:21 Uhr
Hallo Apop85,

wenn du bei SET /P Whitespaces (Leerzeichen oder Tabs) am Zeilenanfang stehen hast, dann werden die auf neueren Windowsversionen verschluckt.

Workaround:
01.
@echo off &setlocal 
02.
 
03.
:: Backspace erzeugen 
04.
for /f %%a in ('"prompt $H &for %%b in (1) do rem"') do set "bs=%%a" 
05.
 
06.
<nul set /p "=   123 " 
07.
echo funktioniert nur fuer XP und aelter. 
08.
<nul set /p "=.%bs%   123 " 
09.
echo funktioniert auch unter Vista und neuer. 
10.
pause
Das Backspace Zeichen funktioniert also genauso als würdest du die Backspace Taste drücken. Für die Ausgabe in einem Batchfenster ist das absolut OK. Bei der Umleitung in eine Datei würde aber auch der Punkt und das Backspace Zeichen mit in der Datei landen.

Grüße
rubberman
Bitte warten ..
Mitglied: Apop85
16.04.2013 um 13:13 Uhr
wenn du bei SET /P Whitespaces (Leerzeichen oder Tabs) am Zeilenanfang stehen hast, dann werden die auf neueren Windowsversionen
verschluckt.
Good to know. Ich überprüf dies einfach mittels %variable:~2,1%
also

01.
if "%variable:~2,1%" == "" set "variable=%variable%0"
selbiges mit zweiter Kommastelle und ganz am Anfang überprüf ich ob nach dem Komma überhaubt was geschrieben ist. Falls nicht dann set variable=000

Bei der Umleitung in eine Datei würde aber auch der Punkt und das Backspace Zeichen mit in der Datei landen.
Kann man ja auch mit obiger Variante wegrationalisieren ;)
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Datein zählen via Batch und Berechnen (1)

Frage von Anrion zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Informationsdienste
gelöst Dienstplan als ics bzw. ical-Datei zur Verfügung stellen (7)

Frage von FreshRawrr zum Thema Informationsdienste ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (29)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...