Top-Themen

Aktuelle Themen (A bis Z)

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)

Mitglied: Apop85

Apop85 (Level 1) - Jetzt verbinden

12.04.2013, aktualisiert 19.04.2013, 6278 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 https://www.administrator.de/forum/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 ..
Ähnliche Inhalte
Humor (lol)

Warum man sein Gast-WLAN nicht beliebig nennen sollte

Erfahrungsbericht von HenereHumor (lol)9 Kommentare

Servus, mal was aus dem Alltag. Zu Hause. Eigentlich wollte ich nur einen weiteren WLAN-AP ins Netz bringen, damit ...

Netzwerkgrundlagen

Anzahl der STP Instanzen auf Cisco Switchen berechnen

Tipp von win-dozerNetzwerkgrundlagen1 Kommentar

(Number of active VLANs x Number of trunks) + Number of access ports Beispiel: (40 Vlans * (31 Trunkports ...

Administrator.de Feedback

Beendet: Stelle dein Wissen unter Beweis und gewinne tolle Preise

Information von FrankAdministrator.de Feedback86 Kommentare

Das Gewinnspiel ist nun beendet. Die Gewinner werden ab dem 15.07 benachrichtigt. Vielen Dank für die vielen Einsendungen :-) ...

Groupware

PfSense und OpenVPN - Hartnäckiges Routing Problem im Remote-Netz erfolgreich gelöst, wie immer. Mit funktionierender, getesteter Konfiguration.

Tipp von Stronzolios.KakaloidisGroupware7 Kommentare

καλημέρα, liebe Kolleginnen und Kollegen, ich hatte ein hartnäckiges Problem mit dem Routing zwischen OpenVPN (mit GUI) und pfSense. ...

Neue Wissensbeiträge
Windows 7

Windows 7 - Server 2008 R2: Exploit für Total Meltdown verfügbar

Information von kgborn vor 21 StundenWindows 7

Kleine Information für Administratoren, die für die Updates von Windows 7 SP1 und Windows Server 2008 R2 SP1 verantwortlich ...

Sicherheit

Zero Day-Schwachstelle im Internet Explorer - wird von APT bereits ausgenutzt

Information von kgborn vor 1 TagSicherheit

Im Kernel des Internet Explorer scheint es eine Zero Day-Lücke zu geben, die von staatlichen Akteuren (APT) im Rahmen ...

Microsoft
Folder Security Viewer-Lizenzen zu gewinnen
Information von kgborn vor 1 TagMicrosoft

Ich nehme das Thema mal in Absprache mit Frank hier auf, da es für den einen oder anderen Administrator ...

Hardware

Feueralarm killt Festplatten in Rechenzentrum - führt zu größerem Ausfall

Information von kgborn vor 1 TagHardware12 Kommentare

Noch ein kleiner Beitrag für Administratoren, die in Rechenzentren aktiv sind - so als Fingerzeig. Denn es gibt Szenarien, ...

Heiß diskutierte Inhalte
Linux
Linux Server oder Windows Server - lohnt eine Umstellung auf Linux und ebenso basierende SW bei einer langfristigen Planung?
Frage von motus5Linux27 Kommentare

Wir brauchen bei uns einen neuen Server. Dieser wird als Fileserver, Domäne Controller sowie Exchange Server verwendet. Wir versuchen ...

C und C++
Frage1 C Programmierung-Makefile Frage2 PHP-Programmierung HTTP-Fehler 404
Frage von KatalinaC und C++24 Kommentare

Hallo, ich habe 2 Fragen, die nichts miteinander zu tun haben aber mit denen ich mich gerade beschäftige: 1. ...

LAN, WAN, Wireless
Watchguard T15 VPN Einrichtung
gelöst Frage von thomasjayLAN, WAN, Wireless22 Kommentare

Hallo zusammen, wir möchten gerne über unsere Watchguard T15 einen VPN-Tunnel (Mobile VPN with IPSec) einrichten! Als Client nutzen ...

DSL, VDSL
ISP Wechsel auf Vodefone Koax, Gebäudeverkabelung nur per Cat 7
gelöst Frage von wusa88DSL, VDSL19 Kommentare

Hallo Zusammen, ich bin momentan bei Mnet als Glasfaser Kunde und möchte Preis/Leistungs-Technisch zu Kabel Deutschland / Vodafone wechseln. ...