Autor Beitrag
Daniel L.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: Do 17.06.10 17:50 
Hallo,

wie kann denn das sein?


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
procedure test;
var  e1, e2 : extended;
begin
  e1 := 54.1;
  e2 :=  (frac (e1)) * 60;
  str (e2, s);
  showmessage (s);                        // 600000000000000E+0000  (wie erwartet)    
  showmessage (Inttostr (trunc (e2)));    // 5         (schock!)     
end;

Gruss: Daniel (verwirrt)
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 17.06.10 17:58 
Bei dem Späßchen würde ich wieder auf die üblichen und nicht vermeidbaren Ungenauigkeiten bei der internen Fließkommadarstellung tippen. Der Wert von e2 ist halt nicht genau 6, sondern nur so ungefähr, und in diesem Fall wohl ganz knapp darunter. ;-)

_________________
We are, we were and will not be.
Daniel L. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 140
Erhaltene Danke: 14

W7, W8
TurboD Prof, Delphi Community
BeitragVerfasst: Do 17.06.10 18:09 
aber wie sollen denn da Ungenauigkeiten entsehen?
frac (54.1) ist genau 0,1, und das * 60 ist genau 6,
wie können denn da Rundungsungenauigkeiten entstehen?
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 17.06.10 18:13 
So, wie man im Dezimalsystem 1/3 nicht exakt darstellen kann (0.33333...) kann man im Binärsystem 1/10 nicht exakt darstellen. Daher kommen dann Ungenauigkeiten zustande, die sich in solchen Dingen bemerkbar machen.

_________________
We are, we were and will not be.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 17.06.10 19:54 
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 918
Erhaltene Danke: 158

Win 10
VS 2013, VS2015
BeitragVerfasst: Fr 18.06.10 00:33 
Eine kleine Bitte:

Sobald du mit Gleitkommazahlen zu tun hast streichst du das Wort "genau" aus deinem Wortschatz und ersetzt es durch das Wort "ungefähr"
Ergebnis:

user profile iconDaniel L. hat folgendes geschrieben Zum zitierten Posting springen:
aber wie sollen denn da Ungenauigkeiten entstehen?
frac (54.1) ist ungefähr 0,1 und das * 60 ist ungefähr 6

Für diesen Beitrag haben gedankt: Hidden
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Fr 18.06.10 01:48 
Hi :)

Also nimmt eine Gleitkommazahl bei Zuweisung einer dezimalen Kommazahl immer genau den Wert an, der in der Form a(2^-1)+b(2^-2)+..=a/2+b/4+c/8+.. den geringsten Fehlerbetrag aufweist? :lupe:

Dann wäre es unter bestimmten Bedingungen(wie hier) ja durchaus günstig, sich zu überlegen, wie man eine Rechnung umformulieren kann, sodass man eine obere oder untere Schranke für den zu berechnenden Ausdruck erhält.

Interessant wären auch (Assembler-)Funktionen, die umsetzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
CeilMultiplication(a, b: Extended): Extended;
// returns r \in R >= a*b | r <= s \ForAll s \in R >= a*b
// guaranteed >= a*b multiplication approx.
FloorMultiplication(a, b: Extended): Extended;
// returns r \in R <= a*b | r >= s \ForAll s \in R <= a*b
// guaranteed <= a*b multiplication approx.


lg,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)