| << Vorheriges Thema anzeigen :: Nächstes Thema anzeigen >> |
| Autor |
Nachricht |
netlinker Greenhorn

Anmeldungsdatum: 07.03.2008 Beiträge: 9
|
Verfasst am: 25.02.2010, 04:22:38 Titel: Rechnen mit großen Werten |
|
|
Hallo,
bei Berechnungen mit großen Werten habe ich das Problem, dass die Ergebnisse 'ungenau' sind.
Ich nutze die TCL Version 8.4, da BLT für die Version 8.5 nicht verfügbar ist.
Bei einigen Berechnungen ist mir jetzt aufgefallen, dass die Ergebnisse nicht meinen Erwartungen entsprachen.
Hier mal zwei Beispiele: | Code: | > set a [expr (pow(2,53) - (pow(2,53)-1))]
1.0
>
> set a [expr (pow(2,54) - (pow(2,54)-1))]
0.0 <== Hier hätte ich auch 1.0 erwartet
>
> expr 12345678901234566.0
12345678901234566.0
> expr 12345678901234567.0
12345678901234568.0 <== Warum ist die letzte Ziffer eine 8??
> expr 12345678901234568.0
12345678901234568.0
> | Ich habe probiert, ob tcl_precision einen Unterschied macht, aber mit tcl_precision 1 & 17 waren die Ergebnisse gleich.
Unter TCL 8.5 ist das Verhalten mit double Werten gleich, mit Integern erhalte ich korrekte Werte, aber ohne BLT nutzt mir das nichts
| Code: | set a [ expr (2**54)-(2**54-1)]
1 | Habt ihr vielleicht einen Tipp wie man unter der TCL Version 8.4 dieses Problem umgehen kann?
Gruß nl |
|
| Nach oben |
|
 |
hank Top-User


Anmeldungsdatum: 10.03.2006 Beiträge: 876 Wohnort: Leipzig
|
Verfasst am: 25.02.2010, 10:49:24 Titel: |
|
|
Hallo,
mit floats wirst du das Problem wahrscheinlich immer haben. Der Typ double hat 64bit Wortbreite und davon 52bit für die Mantisse.
Es gibt auch unter TCL 8.4 den Typ wide, der könnte evtl Abhilfe schaffen. Dieser Typ ist 64bit breit.
| Code: | % expr 1<<54
0
% expr wide(1)<<54
18014398509481984
|
Darüber hinaus gibt es in der tcllib das Paket math::bignum, damit ist beliebige Genauigkeit möglich.
Viele Grüße
Göran |
|
| Nach oben |
|
 |
netlinker Greenhorn

Anmeldungsdatum: 07.03.2008 Beiträge: 9
|
Verfasst am: 25.02.2010, 18:56:32 Titel: |
|
|
Hallo Göran,
danke damit hast du mir sehr weiter geholfen.
Aus irgendeinem Grund verhält sich wide auf dem System anderes.
Auf meinem PC ergibt es das gleiche Ergebnis, wie bei deinem Beispiel | Code: |
$ tclsh
% info tclversion
8.4
% expr wide(1)<<54
0
% expr wide(18014398509481984)
0
% |
Aber mit dem Paket math::bignum klappt es super.
Also nochmals Danke.
Gruß nl |
|
| Nach oben |
|
 |
|