Lazarus rundet, wie umgeht man das?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Lazarus rundet, wie umgeht man das?

Beitrag von MAC »

So, ein spannender Versuch der das Beweist:

(var)wir brauchen:
nen Pc
Lazarus

begin
Label und Knopf erstellen
Bei Drück soll das Label 10 / 3 ausrechne
end;

Beobachtung :

raus kommt ne 3 mit 14 Nachkommastellen. :evil:
Wenn ich die Zahl jetzt aber auf 100 Nachkommastellen genau haben will was soll ich dann machen ?

Code: Alles auswählen

for i:=14 to 100 do Label1.Caption := Label1.Caption + '3'
Das zählt ncht, ich will ja vielleicht auch Zahlen mit unterschiedlichen Nachkommastellen haben  :mrgreen:  ...


Danke

Code: Alles auswählen

Signatur := nil;

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lazarus Rundet !!! wie umgeht man das ???

Beitrag von mschnell »

Es gibt open source Pakete in Pascal, die beliebig genau Gleitpkunkt-Rechnung machnen. z.B. NX-Numerics ( http://www.ellipsa.net/public/nx/nx.html )

-Michael

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Lazarus Rundet !!! wie umgeht man das ???

Beitrag von MAC »

sry, aber mal abgesehen davon das das programm nicht funktioniert (bei mir) sagt mir das nix, außer das das in Lazarus geschrieben ist und es also irgendeine möglichkleit geben muss 10 / 3 zu rechnen ohne das der nach 14 stellen aufhört...

Wie gesagt mir sagt so nen Prog garnix... Ich kenn mich damit nicht aus...

am liebsten wär mir ein

Code: Alles auswählen

Label1.Caption := FlouttoStr(dontround(10/3))

Code: Alles auswählen

Signatur := nil;

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Lazarus Rundet !!! wie umgeht man das ???

Beitrag von monta »

Entweder du nutzt zusätzliche Blibliotheken wie GNURZ hier im Forum oder das obige.

Ansonsten rundet quasi jede Programiersprache, weils anders nicht geht...
Also entweder du gibtst dich mit den angebotenen Stellen zu frieden, was halt durch die Kodierungslänge von Float-Zahlen festgelegt ist, oder du musst nen Umweg suchen. Alle Standardtyppen bauen darauf, das gerundet wird.

viewtopic.php?f=29&t=2015&hilit=GNURZ

Im übrigen langt auch ein '?' schließlich ist das Standardverhalten und kein schwerer Fehler, so wie es bei der Überschrift aussah ;)
Johannes

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Lazarus rundet, wie umgeht man das?

Beitrag von MAC »

thx ich probiers mal mit GNURZ,ich (brauche
) nähmlich ein Programm was Daten verschlüsellt und wenn es bei den rechnungen rundet, wird später die entschlüsselung schwer...

Code: Alles auswählen

Signatur := nil;


Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Lazarus rundet, wie umgeht man das?

Beitrag von af0815 »

MAC hat geschrieben:raus kommt ne 3 mit 14 Nachkommastellen. :evil:
Wenn ich die Zahl jetzt aber auf 100 Nachkommastellen genau haben will was soll ich dann machen ?

Die interen Genauigkeit liegt ganz einfach nicht höher (Ist nicht nur bei Lazarus so). Wenn du jetzt eine Zahl mit wesentlich höherer Genauigkeit haben willst, so musst du auf spezielle Routinen ausweichen. Das ist auch das was Dir vorgeschlagen wurde.

Was natürlich auch geht ist, selbst mit array's von Zahlen zu rechnen (da kannst du dir die Genauigkeit wünschen) - dann aber viel Spaß.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Lazarus rundet, wie umgeht man das?

Beitrag von mschnell »

MAC hat geschrieben:thx ich probiers mal mit GNURZ,ich (brauche nähmlich ein Programm was Daten verschlüsellt und wenn es bei den rechnungen rundet, wird später die entschlüsselung schwer...

"10/3" mit Stellen nach dem Komma Ist Gleitpunktrechnung. Das macht GNURZ nicht (aber NX).
Wenn Du aber verschüsseln willst nützt Dir Gleitpunkt sowieso nichts. Da musst Du Festpunktrechnung machen Also z.b. so etwas wie (3 shl 1000) div 3. Da ist GNURZ durchaus geeignet. (NX ebenfalls, weil NX auch Festpunktrechnung macht.)

Überdenk am besten erst 'mal deine Algorithmen und lies etwas über die Theorie.

-Michael

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Lazarus rundet, wie umgeht man das?

Beitrag von MAC »

10 / 3 war nur ein beispiel ich mach das ohen komma, und deshalb Funktioniert gnurz ganz gut, Danke nochmal. (ich will i wie immer grunz sagen ^^)

Wie ich das mache steht bereits fest. Ich habe es mal alles in Excel geschrieben (jop, in Excel, das mit den tabbellen...)
Doch das rundet genauso wie Lazarus, ist ja auch klar, die können die zahl ja nicht ganz genau rechnen sonnst kommt dannn irgendwann:

"Meldung: sie besitzen eine Kommazahl . Sollen wir sie bis auf die letzte Stelle ausrechnen ? Dann kommen die wieder in 7,5 Millionen Jahren wieder, dann gehts weiter..."

Aber ich hab ne Frage, das wollte ich eigentlich woanders posten aber das geht da nicht. Könnte mir mal jemand in schreiben wie man sagt das
C := "Stringvariable[3] von Edit1.Text ?"
ich hab keine Ahnung wie man das verbinden muss... Danke!

Code: Alles auswählen

Signatur := nil;

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: Lazarus rundet, wie umgeht man das?

Beitrag von monta »

MAC hat geschrieben:Aber ich hab ne Frage, das wollte ich eigentlich woanders posten aber das geht da nicht. Könnte mir mal jemand in schreiben wie man sagt das
C := "Stringvariable[3] von Edit1.Text ?"
ich hab keine Ahnung wie man das verbinden muss... Danke!


Ich hab nicht verstanden was du da ausdrücken willst. Willst du das 3. Zeichen von Edit.Text haben?

Code: Alles auswählen

var c: char;
//...
C := Edit1.Text[3];


oder was soll da raus kommen?
Johannes

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Lazarus rundet, wie umgeht man das?

Beitrag von af0815 »

MAC hat geschrieben:Aber ich hab ne Frage, das wollte ich eigentlich woanders posten aber das geht da nicht. Könnte mir mal jemand in schreiben wie man sagt das
C := "Stringvariable[3] von Edit1.Text ?"
ich hab keine Ahnung wie man das verbinden muss... Danke!


Meinst du ein Stringfunktion damit ? Einen Zeichen/Substring aus dem Editfeldtext zu extrahieren ?

Code: Alles auswählen

c := copy(Edit1.Text,3,1);
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Lazarus rundet, wie umgeht man das?

Beitrag von MAC »

um genau zu seien mein ich damit

Code: Alles auswählen

edit1.text[3]


nur bin ich irgenwie zu dumm das zu merken, habs gerade beim googlen (meine hauptbeschäftigung wenn ich was nicht verstehe...) gesehen...
Und wenn ich richtig denke macht

Code: Alles auswählen

copy(Edit1.Text,3,1)

genau das das gleiche nur das es mir hift, weil ich will mehr als nur ein zeichen wissen (und ich will nicht schreiben : zeichen 1 + zeichen 2 + zeichen3...)

Danke !

Code: Alles auswählen

Signatur := nil;

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Lazarus rundet, wie umgeht man das?

Beitrag von Euklid »

Hallo MAC,

nicht Lazarus, sondern deine CPU rundet ;) - die kann nämlich bestenfalls mit 128bit-Gleitkommazahlen umgehen.

GNURZ rechnet mit rationalen Zahlen exakt. Früher oder später wird eine Routine dazu kommen, welche die rationalen Zahlen in Gleitkommazahlen umwandelt (auf beliebig viele Stellen). Bis dahin wird es aber noch ein Weilchen dauern, da ich nicht die Zeit dazu habe.

Es gibt aber schon gute Mathe-Pakete, die mit langen Gleitkommazahlen direkt rechnen können. mschnell nannte eines.

Viele Grüße, Euklid

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Lazarus rundet, wie umgeht man das?

Beitrag von MAC »

Ah.

Aber ich weis ja nicht bis zu welcher zahl das rechnen kann, ich weis nur das mir 10**3000 (10 hoch 3000) reicht mit (fürs erste :wink:)

Code: Alles auswählen

Signatur := nil;

Antworten