![]() |
AW: Rechenprogramm
Zitat:
Zitat:
Zitat:
Stell mal im Dialog für lange Zahlen den Mauszeiger in das obere Eingabefeld und drücke dann Alt-F1.
Code:
Na ja, das Thema ist ja nun ausgiebig diskutiert worden.
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! 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:
Wenn du dir einen englischen Text mit einer deutschen Stimme vorlesen lässt, na klar klingt die deutsch. Zitat:
Delphi-Quellcode:
und das dann nicht kompiliert wird?
A:=100.000.000,00
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:
|
AW: Rechenprogramm
Liste der Anhänge anzeigen (Anzahl: 1)
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. |
AW: Rechenprogramm
Zitat:
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:
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:
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: ![]() Zum ausprobieren: ![]() 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:
Hab die geänderte Version in #1 gestellt. |
AW: Rechenprogramm
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. |
AW: Rechenprogramm
Hallo Profi
weisst du wie man deine hlp in Win10 öffnet? Wenn ich das tun will, dann wird eine ![]() 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 |
AW: Rechenprogramm
Zitat:
Zitat:
Variationen ohne Wiederholung Varis(50,3,1) Variationen mit Wiederholung Combis = Kombinationen mit oder ohne Wiederholung. Gleiche Syntax wie Varis. Zitat:
|
AW: Rechenprogramm
Zitat:
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); |
AW: Rechenprogramm
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... ;-). |
AW: Rechenprogramm
Zitat:
Statt (für N=1000) hätte ich statt 1000 Multiplikationen 1000 mal Log10(), und Log10() braucht seine Zeit. |
AW: Rechenprogramm
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). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz