AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Rechenprogramm

Rechenprogramm

Ein Thema von Amateurprofi · begonnen am 31. Mai 2009 · letzter Beitrag vom 7. Okt 2020
Antwort Antwort
Seite 8 von 10   « Erste     678 910   
Amateurprofi
Registriert seit: 17. Nov 2005
Neue Version vom 06.10.2020 (Version 3.4.1.1)
Info hierzu weiter unten in #91

Neue Version vom 26.09.2020 (Version 3.3.3.1)
Info hierzu weiter unten in #74

Neue Version vom 16.04.2018 (Version 3.3.2.1)
Info hierzu weiter unten in #73

Neue Version vom 12.04.2018 (Version 3.3.1.1)
Was neu ist siehe #60 weiter unten.

Neue Version vom 12.04.2018 (Version 3.2.1.1)
Was neu ist siehe letzter Beitrag weiter unten.

Neue Version vom 13.07.2010 (Version 2.3.1.1)
Was neu ist siehe letzter Beitrag weiter unten.

Neue Version vom 27.02.2010
Hochgeladen wegen eines Hinweises auf einen Bug (Siehe # 50)
Was alles neu ist : Siehe #51
Achtung, ich hab das jetzt nur wegen des Bugs hochgeladen.
Einige Teile des Programms befinden sich in einer Änderungsphase, und es ist mit Fehlern zu rechnen.
Die Teile, die bisher funktionierten sollten davon aber nicht betroffen sein.




Neue Version vom 28.07.2009

Vielleicht kann der oder die eine oder andere etwas mit anhängendem Rechenprogramm anfangen.
Das Hauptfenster enthält zwei Textfenster. In das rechte können numerische Ausdrücke eingegeben werden, im anderen werden die Ergebnisse ausgegeben.
Die Auswertung der Ausdrücke erfolgt immer dann, wenn im rechten Textfenster etwas geändert wird.
Das Programm kennt die gängigen Rechenoperatoren und Funktionen und etwas mehr.
Zum Beispiel werden Ein-/Ausgabe in unterschiedlichen Zahlensystemen, das Rechnen mit Datums- und Zeitangaben und mit Brüchen unterstützt.
Wer das Programm ausprobieren möchte, sollte nach dem ersten Start des Programmes mit Menu > Hilfe > Einführung auswählen. Ein (zugegebenermaßen simpel gestricktes) Tutorial gibt einen Einblick. Ausführlichere Infos können dem Helpfile, der mit Menu > Hilfe > Hilfe aufgerufen wird, entnommen werden.


Zahlen können ein- und ausgegeben werden als
Dezimalzahl, z.B. 2009, 3.14, 1.5e3
Hexzahl, z.B. $7D9 = Dezimal 2009
Binärzahl, z.B. "11111011001 = Dezimal 2009
Zahl mit anderer Basis, z.B. #8#3731 = Dezimal 2009
Römische Zahl, z.B. 'MMIX = Dezimal 2009
Datum, z.B. 10.5.2009 = 10. Mai 2009
Uhrzeit, z.B. 11:55:00 = Fünf vor 12
Datum + Uhrzeit, z.B. 10.5.2009 11:55:00
Kalenderwoche, z.B. wk19/2009
Bruch, z.B. 3//4 oder _3/4 = Dezimal 0.75
Winkel, z.B. 45°10'
Positionsangabe, z.B. 53°34'02.12"N, 10°01'20.24"E = Eine Position in Hamburg
Speicherauszug, z.B. ?00 00 00 00 00 00 20 FB 09 40 = Dezimal 2009

Als Operatoren sind z.Z. implementiert

Dyadische Operatoren, die zwischen 2 Werten stehen
Grundrechenarten
+, -, *, /
Erweiterte Grundrechenarten
\, Div Dividieren mit Integer-Resultat
|, Mod Modulo mit reellem Resultat
\\, IDiv Integer Division mit Integer-Resultat
||, IMod Modulo aus Integer Division
\*, DivMul Integer Division mit anschließender Multiplikation
^ Potenzieren
Logische- / Boolesche Operatoren
And, Or, Xor, Nand, Nor, Xnor
Vergleichs Operatoren mit Vergleichtoleranz
<, <=, =, <>, >=, >
Vergleichs Operatoren ohne Vergleichtoleranz
<< Kleiner
<== Kleiner oder identisch
== Identisch
<>> Nicht identisch
>== Größer oder identisch
>> Größer
Bitverschiebungs Operatoren
Shl, Shr, Rol, Ror
Bit-orientierte Operatoren
Bts Bit = 1 setzen
Btr Bit = 0 setzen
Btc Bit "umdrehen"
Btt Bit testen

Monadische Operatoren, die vor einem Wert stehen
- Vorzeichen bzw. Negation
+ Nur der Vollständigkeit halber
Not Boolesche / Bitweise Negation

Monadische Operatoren, die hinter einem Wert stehen
² Quadrieren
³ Dritte Potenz
° Umrechnung von Grad in Rad (Bogenmaß)
°° Umrechnung von Rad (Bogenmaß) in Grad
! Fakultät
€ Umrechnung von Euro in DM
€€ Umrechnung von DM in Euro
' Extrahieren des Exponenten

Als Funktionen sind zur Zeit implementiert
Standardfunktionen
Abs(v) Absolutwert
Sqr(v) Quadrat
Sqrt(v) Quadratwurzel
Winkelfunktionen
Sin(v) Sinus
Cos(v) Kosinus
Tan(v) Tangens
Cot(v) Kotangens
Sec(v) Sekans
Csc(v) Kosekans
SinH(v) Sinus Hyperbolicus
CosH(v) Kosinus Hyperbolicus
TanH(v) Tangens Hyperbolicus
CotH(v) Kotangens Hyperbolicus
SecH(v) Sekans Hyperbolicus
CscH(v) Kosekans Hyperbolicus
ArcSin(v) ArcusSinus
ArcCos(v) ArcusKosinus
ArcTan(v) ArcusTangens
ArcCot(v) ArcusCotangens
ArcSec(v) ArcusSekans
ArcCsc(v) ArcusCosekans
ArcSinH(v) AreaSinus Hyperbolicus
ArcCosH(v) AreaKosinus Hyperbolicus
ArcTanH(v) AreaTangens Hyperbolicus
ArcCotH(v) AreaCotangens Hyperbolicus
ArcSecH(v) AreaSekans Hyperbolicus
ArcCscH(v) AreaCosekans Hyperbolicus
RadToDeg(v) Bogenmaß in Grad umrechen
RadToGon(v) Bogenmaß in Gon umrechen
RadToCycle(v) Bogenmaß in Cycles umrechen
DegToRad(v) Grad in Bogenmaß umrechnen
DegToGon(v) Grad in Gon umrechnen
DegToCycle(v) Grad in Cycles umrechnen
GonToRad(v) Gon in Bogenmaß umrechnen
GonToDeg(v) Gon in Grad umrechnen
GonToCycle(v) Gon in Cycles umrechnen
CycleToRad(v) Cycles in Bogenmaß umrechnen
CycleToDeg(v) Cycles in Grad umrechnen
CycleToGon(v) Cycles in Gon umrechnen
Logarithmische und exponentielle Funktionen
Ln(v) Natürlicher Logarithmus
Lg(v) Dekadischer Logarithmus
Log10(v) Dekadischer Logarithmus
Log2(v) Dualer Logarithmus
LogN(base,v) Logarithmus zu beliebiger Basis
ALn(v) Umkehrung des natürlichen Logarithmus
ALg(v) Umkehrung des dekadischen Logarithmus
ALog10(v) Umkehrung des dekadischen Logarithmus
ALog2(v) Umkehrung des dualen Logarithmus
ALogN(base,v) Umkehrung des Logarithmus zu beliebiger Basis
Root(x, y) Yte Wurzel aus x
Power(x, y) Yte Potenz von x
Exp(v) Vte Potenz von e
ExpMod(b, e, m) Modulo einer Potenz (=(b ^ e) Mod m)
Exponent(v) Exponent eines reellen Wertes
Rundungsfunktionen
Int(v) Integerwert
Trunc(v) Nachkommateil entfernen
Frac(v) Nackkommateil
Round(v) Runden
Floor(v) Abrunden
Ceil(v) Aufrunden
Bitorientierte Funktionen
BTL(v, len) Unterstes gesetztes Bit
BTH(v, len) Höchstes gesetztes Bit
BTN(v, len) Anzahl gesetzter Bits
BTP(v, len) BitParität
Kalender-, Datums- und Zeitfunktionen
HDay(name,year) Datum eines Feiertages in einem Jahr
Easter(year) Datum des Ostersonntags
Advent(year) Datum des Ersten Advent
Time(hh, mm, ss) Zeit
Date(y, m, d) Datum
DT(y, m, d, hh, mm, ss) Datum und Zeit
Today Aktuelles Datum
Now Aktuelles Datum mit aktueller Zeit
Secs(v) Umrechnung in Sekunden
Mins(v) Umrechnung in Minuten
Hours(v) Umrechnung in Stunden
Days(v) Umrechnung in Tage
Weeks(v) Umrechnung in Wochen
Months(v) Umrechnung in Monate
Years(v) Umrechnung in Jahre
Julian(v) Nummer des Tages im Jahr
JD(v) Julianisches Datum
JDtoGreg(v) Gregorianisches Datum
Entfernungsberechnung
GeoDist(p1,p2,r,f) Entfernung zwischen 2 Orten
GeoPath(Liste) Summe von Entfernungen zwischen Orten
GeoPos(w1, w2) Positionsangabe aus 2 Winkeln erstellen
Latitude(p) Breitengrad aus Positionsangabe extrahieren
Longitude(p) Längengrad aus Positionsangabe extrahieren
Sonstiges
Min(Liste) Minimum
Max(Liste) Maximum
Sum(Liste) Summe
Avg(Liste) Mittelwert
Mul(Liste) Produkt
QSum(Liste) Summe von Quadraten
LCD(Liste) Größter gemeinsamer Teiler
SCM(Liste) Kleinstes gemeinsames Vielfaches
Frc(v) Dezimalzahl in Bruch wandeln
Combis(N, K, r) Anzahl Kombinationen
Varis(N, K, r) Anzahl Variationen
NK(N, K) N über K (Anzahl Kombinationen)
HGV(N, K, r, z, p) Hypergeometrische Verteilung
HGVX(N, K, g, r, p) Hypergeometrische Verteilung
Encode((Liste),Liste) Verschlüsseln
Cvt( v, from, to ) Maßeinheiten umrechnen
Convert( v, from, to ) Maßeinheiten umrechnen
Bmi( v1, v2) Body-Mass-Index
Angehängte Dateien
Dateityp: zip Calculator 3.3.1.1.zip (1,50 MB, 24x aufgerufen)
Dateityp: zip Calculator 3.3.2.1.zip (2,07 MB, 28x aufgerufen)
Dateityp: zip Calculator 3.3.3.1.zip (2,09 MB, 27x aufgerufen)
Dateityp: zip Calculator_3.4.1.1.zip (1,60 MB, 20x aufgerufen)
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....

Geändert von Amateurprofi ( 6. Okt 2020 um 01:45 Uhr) Grund: Fehler behoben
 
Amateurprofi

 
Delphi XE2 Professional
 
#71
  Alt 13. Apr 2018, 15:37
Ich habe noch ein wenig herumprobiert, der Fehler den ich bekomme passiert wenn man zu schnell TextToSpeech mit Englisch On/Off aufruft, über das Menü. (Fehler kommt nur wenn man übers Menü bedient, Knöpfe arbeiten sauber.)

Da ist auch ein mini-Fehler drinn, vielleicht ist es ja auch so gedacht:
Beim Vorlesen, erzählt die Stimme korrekt Vorkommazahlen, aber ein Komma wird als Punkt gelesen und Nachkommastellen werden einzeln gelesen und nicht als ein Wert.
Also aus 123,45 wird Einhundertdreiundzwanzig Punkt Vier Fünf. Aber super Job mit den Vorkommazahlen!

Englische Sprache klingt Deutsch, ich glaube Sapi 5 hat da mehrere Aus-/Sprachen integriert.

Auch eine mini-Unzugänglichkeit, wenn man Werte mit Tausendermarkierungen einfügt, kann Dein Programm nichts mit dem Wert anfangen. Beispiel: Wenn man "100.000.000,00" eingibt/einfügt, sagt der es ist ein falsches Datum und andersrum "100,000,000.00" = Ende erwartet.

Dein Hilfesystem find ich mehr als gelungen, es ist "Yeah!"
Auch die zwei verschieden Arten wie man sich einen Fehler angucken kann = 1A gelöst, Hut ab!
Offene Wünsche zu diesem Projekt hab ich keine, nur eventuell noch ein mini-Goodie, wenn man bei Fehler auf's [i] klickt, hast du ja alles richtig gemacht, alles warum Fehler ausgelöst wurde wird angezeigt, vielleicht kann man da noch eine Zeile einfügen mit einem Vorschlag wie man es richtig machen könnte oder was für eine Eingabe Dein Programm an dieser Stelle erwartet, so als Beispiel-Text.
Zitat:
Ich habe noch ein wenig herumprobiert, der Fehler den ich bekomme passiert wenn man zu schnell TextToSpeech mit Englisch On/Off aufruft, über das Menü. (Fehler kommt nur wenn man übers Menü bedient, Knöpfe arbeiten sauber.)
Verstehe nicht so richtig, wie du das meinst. Ich vermute, du hast während des Vorlesens die Sprache umgestellt. Kannst du etwas genauer erklären was du genau gemacht hast.

Zitat:
Da ist auch ein mini-Fehler drinn, vielleicht ist es ja auch so gedacht:
Beim Vorlesen, erzählt die Stimme korrekt Vorkommazahlen, aber ein Komma wird als Punkt gelesen
In diesem Programm wird der Punkt als Dezimaltrennzeichen verwendet.
Stell mal im Dialog für lange Zahlen den Mauszeiger in das obere Eingabefeld und drücke dann Alt-F1.

Code:
und Nachkommastellen werden einzeln gelesen und nicht als ein Wert.
Also aus 123,45 wird Einhundertdreiundzwanzig Punkt Vier Fünf. Aber super Job mit den Vorkommazahlen!
Na ja, das Thema ist ja nun ausgiebig diskutiert worden.
Recht hast du, dass im Sprachgebrauch, z.B. an der Kasse "eins fünfzig" gesagt wird.
Aber im Thread sagst du auch "Also wenn der Dir "Pi" aufschlüsselt, sagt er logischerweise alles einzeln."
Warum ist das logisch? Soll man denn besser "drei komma eins vier" sagen, statt "drei komma vierzehn".
Ich denke es ist gar nicht so einfach, eine klare Definition zu erstellen, wann man den Nachkommateil zu einer Zahl zusammenfasst und wann nicht.
Ich sehe das so:
Bei Geldbeträgen oder z.B. bei Längenangaben (in m) sagt man "eins fünfundfünfzig" und meint "1 Euro und 55 Cent" bzw. "1 Meter und 55 Zentimeter".
Allerdings würde ich für 1.333 km nie "eins dreihundertdreiunddreißig" und für 1.33 km auch nie "eins dreiunddreißig" sagen.
Da das Programm nicht weiß, ob der User gedanklich an der Kasse steht, ist es nicht möglich zu entscheiden wann die Ziffern einzeln zu sprechen sind und wann nicht. Man könnte natürlich eine Option einbauen dass z.B. bei zwei Nachkommastellen diese zu einer Zahl zusammengefasst werden. (Hab ich aber nicht vor)

Zitat:
Englische Sprache klingt Deutsch, ich glaube Sapi 5 hat da mehrere Aus-/Sprachen integriert.
Ich denke das hängt von der Stimme ab, mit der du etwas vorlesen lässt.
Wenn du dir einen englischen Text mit einer deutschen Stimme vorlesen lässt, na klar klingt die deutsch.

Zitat:
Auch eine mini-Unzugänglichkeit, wenn man Werte mit Tausendermarkierungen einfügt, kann Dein Programm nichts mit dem Wert anfangen. Beispiel: Wenn man "100.000.000,00" eingibt/einfügt, sagt der es ist ein falsches Datum und andersrum "100,000,000.00" = Ende erwartet.
Würdest du es auch als eine "mini-Unzugänglichkeit" bezeichnen, wenn du in Delphi schreibst A:=100.000.000,00 und das dann nicht kompiliert wird?

Das ist keine Unzulänglichkeit und auch keine mini-Unzulänglichkeit sondern absolut korrekt.
Lies mal in der Hilfe, wie der Begriff Zahl für dieses Programm definiert ist.
Menu > Hilfe > Hilfe
Und in der Hilfe: Syntax von Ausdrücken > Zahl > Dezimalzahl
Zitat Anfang:
Eine Dezimalzahl kann sein:
Eine Folge von Ziffern. (Beispiel 12345)
Eine Folge von Ziffern, gefolgt von einem Dezimalpunkt gefolgt von Ziffern. (Beispiel 123.45)
Ein Dezimalpunkt, gefolgt von Ziffern. (Beispiel .45) (Nur im Normal-Modus)
Der Zahl kann ein Vorzeichen vorgestellt sein. (Beispiel -12345)
Der Zahl kann ein Skalierungsfaktor folgen. Dieser besteht aus einem 'E' oder 'e', gefolgt von einer ggfs. vorzeichenbehafteten, Ziffernfolge. Beispiele (1.45E2, 1.45E-2)
Zitat Ende.

Bei Deinen Eingaben passiert folgendes

"100.000.000,00"
Der Parser findet Ziffern Punkt Ziffern Punkt.
Nach dem zweiten Punkt ist für den Parser klar, dass das ein Datum sein muss, weil es keinen anderen gültigen Wert mit dieser Syntax gibt. Also wird versucht, den Text als Datum zu lesen und es wird bemerkt, dass die erste Ziffernfolge (100) nicht als Nummer eines Tages im Monat interpretiert werden kann. Also Fehlermeldung mit Fehlerstelle hinter der ersten 100.

"100,000,000.00"
Der Parser findet Ziffern Komma.
Schon hier ist klar, dass es keinen gültigen Ausdruck mit dieser Syntax gibt aber das Werfen der Fehlermeldung wird der Routine zur Auswertung von Ausdrücken überlassen.
Die liest dann eine Zahl (100) und erwartet danach entweder das Ende der Zeile oder einen Operator wie "+", "-", "*", "/" etc..
Gefunden wird ein Komma, dass hier nicht stehen sollte.
Also Fehlermeldung bei der das Komma hinter der ersten 100 als Fehlerstelle markiert ist.

Zitat:
wenn man bei Fehler auf's [i] klickt, hast du ja alles richtig gemacht, alles warum Fehler ausgelöst wurde wird angezeigt, vielleicht kann man da noch eine Zeile einfügen mit einem Vorschlag wie man es richtig machen könnte oder was für eine Eingabe Dein Programm an dieser Stelle erwartet, so als Beispiel-Text.
Wer ich mir bei Gelegenheit mal anschauen - wird sicher nicht in allen Fällen machbar sein, aber versuchen kann man das ja mal.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

 
Delphi 11 Alexandria
 
#72
  Alt 13. Apr 2018, 16:49
Habe alles soweit Verstanden, danke für's Erklären.

Das mit der Sprache tut mir leid, ich wollte keine Diskussion starten.

Übrigens, mit den Tausendermarken bin ich drauf gekommen weil dein Programm aus "100,000000" = "100 Mi-llionen" macht. Siehe Bild. Nun weiß ich ja das Kommata bei Dir nicht trennt sondern ein Punkt.

Das "Memory-Leak" Fenster bekomme ich relativ oft indem ich bei Lange Zahlen irgendwas mache und prompt übers Hauptfenster [X]'e.
Den Exception Fehler kann ich gerade selbst nicht reproduzieren, war vielleicht Zufall, ich weiß leider echt nicht mehr exakt was ich da tat, neues Programm = alles klicken machen tuen (die Exception enstand aus dem Menu heraus als ich mit der Sprachausgabe rumspielte)

Ps: Wenn das Programm geschlossen wird und man die Hilfe offen hatte, bleibt diese offen, soll das so sein?
Pps: Mit der Sprache Deutsch/Englisch. Da meinte ich, es gibt in der Sapi auch verschiedene "Sprecher" aus verschiedenen Ländern. Also nicht nur Frau/Deutsch. Ich geh einfach mal davon aus das Du Sapi verwendest, verzeih falls ich falsch liege.
Ppps: Nach wie vor, dein Hilfesystem ist super!

Wie dem auch sei, Calculator funktioniert für meine schmalen Bedürfnisse ausgezeichnet aber da ich viel über die Zwischenablage kopiere und einfüge, ist mir das mit der Tausendertrennung halt sofort ins Auge gesprungen.
Miniaturansicht angehängter Grafiken
calc_bignumbers.jpg  
  Mit Zitat antworten Zitat
Amateurprofi

 
Delphi XE2 Professional
 
#73
  Alt 16. Apr 2018, 12:21
Habe alles soweit Verstanden, danke für's Erklären.

Das mit der Sprache tut mir leid, ich wollte keine Diskussion starten.

Übrigens, mit den Tausendermarken bin ich drauf gekommen weil dein Programm aus "100,000000" = "100 Mi-llionen" macht. Siehe Bild. Nun weiß ich ja das Kommata bei Dir nicht trennt sondern ein Punkt.

Das "Memory-Leak" Fenster bekomme ich relativ oft indem ich bei Lange Zahlen irgendwas mache und prompt übers Hauptfenster [X]'e.
Den Exception Fehler kann ich gerade selbst nicht reproduzieren, war vielleicht Zufall, ich weiß leider echt nicht mehr exakt was ich da tat, neues Programm = alles klicken machen tuen (die Exception enstand aus dem Menu heraus als ich mit der Sprachausgabe rumspielte)

Ps: Wenn das Programm geschlossen wird und man die Hilfe offen hatte, bleibt diese offen, soll das so sein?
Pps: Mit der Sprache Deutsch/Englisch. Da meinte ich, es gibt in der Sapi auch verschiedene "Sprecher" aus verschiedenen Ländern. Also nicht nur Frau/Deutsch. Ich geh einfach mal davon aus das Du Sapi verwendest, verzeih falls ich falsch liege.
Ppps: Nach wie vor, dein Hilfesystem ist super!

Wie dem auch sei, Calculator funktioniert für meine schmalen Bedürfnisse ausgezeichnet aber da ich viel über die Zwischenablage kopiere und einfüge, ist mir das mit der Tausendertrennung halt sofort ins Auge gesprungen.
Hallo KodeZwerg,
ich habe einiges versucht, um Memoryleaks zu erzeugen, aber ohne Erfolg.
Wenn so etwas wieder auftritt und du dann auch weißt wie es dazu kam und das ganze auch reproduzierbar ist, gehe ich dem gerne nach.

Zitat:
Ps: Wenn das Programm geschlossen wird und man die Hilfe offen hatte, bleibt diese offen, soll das so sein?
Darüber hab ich vorher noch nie nachgedacht.
Ich habe jetzt die Möglichkeit implementiert, vorzugeben, ob und wann die Hilfe automatisch geschlossen wird.
Mit Menu > Optionen > Einstellungen öffnest du den Einstellungen Dialog. In der Gruppe "Bei Programmende" kannst du festlegen, ob eine ev. geöffnete Hilfe automatisch geschlossen werden soll und ob das beim Schließen eines Dialoges geschehen soll oder erst beim Beenden des Programms.

Zitat:
Pps: Mit der Sprache Deutsch/Englisch. Da meinte ich, es gibt in der Sapi auch verschiedene "Sprecher" aus verschiedenen Ländern. Also nicht nur Frau/Deutsch. Ich geh einfach mal davon aus das Du Sapi verwendest, verzeih falls ich falsch liege.
Nee, meines wissens gibt es in der SAPI überhaupt keine "Sprecher".
SAPI (Speech Application Programming Interface) ist nur eine Programmierschnittstelle zur Sprachsynthese und Spracherkennung,
um z.B. einen Text vorlesen zu können, muss auch eine "Stimme" auf dem Rechner installiert sein.
Und ja, es gibt da nicht nur z.B. Mann/Deutsch oder Frau/Deutsch sondern recht viele verschiedene Stimmen.
Für einen Überblick: http://ttssamples.syntheticspeech.de/
Zum ausprobieren: https://www.linguatec.de/voice-reader-home-15-demo/
Tja, und da wir gerade bei Sprachausgabe sind:
Hast du schon registriert, dass der kleine Smiley auf dem "Speak"-Button "vor sich hinsabbelt", wenn etwas vorgelesen wird?
Und Klicke mal den "Speak"-Button mit gedrückter Shift oder Ctrl Taste oder auch beide.

Zitat:
Ppps: Nach wie vor, dein Hilfesystem ist super!
Danke. Hat einiges an Arbeit gekostet.

Hab die geänderte Version in #1 gestellt.
  Mit Zitat antworten Zitat
Amateurprofi

 
Delphi XE2 Professional
 
#74
  Alt 26. Sep 2020, 01:27
Ich habe in #1 eine neue Version des Programms (3.3.3.1) hochgeladen, weil ich einen Fehler im Programm behoben habe.
Im "BigDecimal"-Modus wurden gelegentlich Exceptions ausgelöst, auch wenn kein Fehler vorlag.
  Mit Zitat antworten Zitat
Michael II

 
Delphi 11 Alexandria
 
#75
  Alt 26. Sep 2020, 21:40
Hallo Profi

weisst du wie man deine hlp in Win10 öffnet? Wenn ich das tun will, dann wird eine m$ Seite angezeigt mit Downloads für Systeme bis und mit Win 8.1. Ich habe dann mal 8.1 geladen - aber das führt einfach nur zu einer weiteren Fehlermeldung.

Wichtigere Frage... Wieso kann ich mit deinem Rechner "nur" bis 1754! rechnen?

Eine "tief" Funktion ( n tief k = n!/(k!*(n-k)!) ) wäre auch gut. Evt. hast du's ja bereits eingebaut und ich seh's einfach nicht.

Gruss
M
Michael Gasser
  Mit Zitat antworten Zitat
Amateurprofi

 
Delphi XE2 Professional
 
#76
  Alt 26. Sep 2020, 23:34
Hallo Profi

weisst du wie man deine hlp in Win10 öffnet? Wenn ich das tun will, dann wird eine m$ Seite angezeigt mit Downloads für Systeme bis und mit Win 8.1. Ich habe dann mal 8.1 geladen - aber das führt einfach nur zu einer weiteren Fehlermeldung.

Wichtigere Frage... Wieso kann ich mit deinem Rechner "nur" bis 1754! rechnen?

Eine "tief" Funktion ( n tief k = n!/(k!*(n-k)!) ) wäre auch gut. Evt. hast du's ja bereits eingebaut und ich seh's einfach nicht.

Gruss
M
Zitat:
Eine "tief" Funktion ( n tief k = n!/(k!*(n-k)!) ) wäre auch gut.
Gib ein Varis(50,3) oder Varis(50,3,0)
Variationen ohne Wiederholung
Varis(50,3,1)
Variationen mit Wiederholung
Combis = Kombinationen mit oder ohne Wiederholung. Gleiche Syntax wie Varis.
Zitat:
weisst du wie man deine hlp in Win10 öffnet?
Nein, weiss ich leider nicht, ich arbeite mit Windows 7.
  Mit Zitat antworten Zitat
Amateurprofi

 
Delphi XE2 Professional
 
#77
  Alt 26. Sep 2020, 23:44
Hallo Profi
Wichtigere Frage... Wieso kann ich mit deinem Rechner "nur" bis 1754! rechnen?
Gruss
M
Hab ich mit PN beantwortet, hier noch mal für andere.

Das Maximum 1754 für N! (im Normal-Modus) resultiert aus dem größten in einem Extended darstellbaren Wert (1.1E+4932).
1755! ergäbe 3.473E+4933 und würde den Maximalwert überschreiten.

Übrigens:
Im Normal-Modus werden in meinem Programm alle Werte in Extended-Variablen gespeichert, was auch der Grund ist, warum es keine 64Bit Version gibt (Da ist Extended = Double).

Tatsächlich rechne ich N! mit der FPU. Hier der Code
Delphi-Quellcode:
PROCEDURE MonOpFacul(var V:TValue);
asm // EAX=@TValue
// CheckMinMax(v.v,0,1754,pact,116);
// n:=Trunc(v.v);
// v.v:=1;
// while n>1 do begin
// v.v:=v.v*n;
// dec(n);
// end;
          // ASM Version braucht 1/6 der Zeit und ist kürzer, auch wenns
          // nicht so aussieht.
                   mov byte [eax].TValue.Vt,vtNone
                   fld tbyte[eax].TValue.V
                   fldz
                   fcomip st,st(1)
                   ja @Err
                   fild dword [@1754]
                   fcomip st,st(1)
                   jae @Ok
 @Err: mov eax,117
                   mov edx,pact
                   jmp ASMError1
 @1754: dd 1754
 @Ok: sub esp,8
                   fnstcw word [esp+4]
                   fnstcw word [esp+6]
                   fwait
                   or word [ESP+4], $0F00 // trunc toward zero, full precision
                   fldcw word [ESP+4]
                   fistp dword [esp]
                   fwait
                   fldcw word [esp+6]
                   fld1
                   mov edx,[esp]
                   sub edx,1
                   jbe @Fin
 @Loop: fimul dword [esp]
                   mov [esp],edx
                   sub edx,1
                   ja @Loop
 @Fin: fstp tbyte[eax].TValue.V
                   add esp,8
end;
Delphi-Quellcode:
   // Vom Parser benutzter Werte-Record
    // CanDeformat : Info, ob der von NumStr erzeugte Ausgabe-String
    // wieder deformatiert werden kann
    // Vt : Wofür der Wert steht
    // V : Der numerische Wert
    // Numerator : Zähler, wenn Vt=vtFraction
    // Denominator : Nenner, wenn Vt=vtFraction
    // Latitude : Breitengrad, wenn Vt=vtGeoPos
    // Longitude : Längengrad, wenn Vt=vtGeoPos
    // ClrVal : Fabbdaten, wenn Vt=vtColor
    TValue=packed Record
       CanDeformat:Boolean;
       Vt:TValueType;
       V:Extended;
       case Integer of
          1 : (Numerator:Extended;
                 Denominator:Extended);
          2 : (Latitude:Extended;
                 Longitude:Extended);
          3 : (LatLon:Array[Boolean] of Extended);
          4 : (ClrVal:TColorValue);
    end;
  // Wofür ein Wert steht (vtNone=einfache Zahl)
    TValueType=(vtNone,vtBool,vtColor,vtFraction,
                vtSeconds,vtMinutes,vtHours,vtDays,vtWeeks,vtMonths,vtYears,
                vtTime,vtDate,vtDateTime,
                vtGeoPos);
  Mit Zitat antworten Zitat
Michael II

 
Delphi 11 Alexandria
 
#78
  Alt 27. Sep 2020, 06:25
Besten Dank!

Du könntest
x = e^ln(x) bzw. hier besser
x = 10^lg(x) und
log(ab)=log(a)+log(b)
ausnutzen.

Dann kannst du x! schreiben als x! = 10^lg(1*2*3...*x) = 10^(lg(1)+...lg(x)).

Fürs Coden: Du berechnest zuerst
s = lg(1)+...lg(x)

Sei s = e + m, wobei e = trunc(s) und m = frac(s)

x! = 10^s = 10^(e+m) = 10^m * 10^e.

Output:
10^m rechnest du aus, e lässt du als Exponent stehen.

Ich fühl mich gerade zurückversetzt in die Zeiten des hp41CV... .
Michael Gasser

Geändert von Michael II (27. Sep 2020 um 06:31 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

 
Delphi XE2 Professional
 
#79
  Alt 27. Sep 2020, 10:01
Besten Dank!

Du könntest
x = e^ln(x) bzw. hier besser
x = 10^lg(x) und
log(ab)=log(a)+log(b)
ausnutzen.

Dann kannst du x! schreiben als x! = 10^lg(1*2*3...*x) = 10^(lg(1)+...lg(x)).

Fürs Coden: Du berechnest zuerst
s = lg(1)+...lg(x)

Sei s = e + m, wobei e = trunc(s) und m = frac(s)

x! = 10^s = 10^(e+m) = 10^m * 10^e.

Output:
10^m rechnest du aus, e lässt du als Exponent stehen.

Ich fühl mich gerade zurückversetzt in die Zeiten des hp41CV... .
Das wäre aber eine schöne Verschlimmbesserung.
Statt (für N=1000) hätte ich statt 1000 Multiplikationen 1000 mal Log10(), und Log10() braucht seine Zeit.
  Mit Zitat antworten Zitat
Michael II

 
Delphi 11 Alexandria
 
#80
  Alt 27. Sep 2020, 10:58
Du hast natürlich Recht. Das von mir vorgeschlagene "Verfahren" ist mathematischer Bocks-Mist. Es führt zwar aufs richtige Resultat. Aber der Weg.... [Ich war soeben beim Ponys Misten und obschon es auf 800müM bereits ziemlich kalt und windig ist, war die Jacke plötzlich völlig überflüssig als mir einfiel, dass das was ich geschrieben.... Du kannst natürlich direkt Mantisse und Exponent separieren und über die 1754! Grenze hinaus multiplizieren... ich lasse es zur Belustigung stehen... ]


Ich schlage dieses Verfahren ja nicht für "kleine" Werte von x (also nicht für x <= 1754) vor. Mir ist vollkommen klar, dass der Aufwand via log10 weit grösser ist. Wenn ich dich aber richtig verstehe, kann dein Programm Näherungswerte "nur" bis 1754! berechnen, dann ist aus.

Wenn du aber über den Exponenten zur Basis 10 rechnest, kommst du an Orte, wo nie jemand zuvor gewesen ist.

Du könntest deine Superschnellmethode bis 1754 nutzen und ab dann via log die Näherungswerte berechnen.

Für grosse Werte - kommen in der Statistik durchaus vor - könnte dein Programm zum Beispiel jeden 100sten ! Wert tabellieren; dann müsstest du nicht allzu viele log10 addieren.

War nur ein Vorschlag - mehr nicht.

Besten Dank für deine Tipps zu "tief" und Co (Kombinatorik Teil in deinem Calculator).
Michael Gasser

Geändert von Michael II (27. Sep 2020 um 15:05 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz