mboost-dp1
Værste hack N.O.G.E.N.S.I.N.D.E
- Forside
- ⟨
- Forum
- ⟨
- Tagwall
Syntes lige jeg vil dele den her med jer. Sidder som udvikler på et program, der blev startet op i 1990 og faldt over følgende afsnit i en obskur hjemmebrygget afrundingsfunktion, jeg aldrig har haft kigget i før:
{*********** Dette er KUN pga. nød *************}
HeltalsDel := 58319321.365;
if (Ant_Dec = 2) and (abs(Tal_real) = HeltalsDel) then
begin
if (Tal_real >= 0.0) then
begin
Tal_real := 58319321.37;
end
else
begin
Tal_real := -58319321.37;
end;
Exit;
end;
{***********************************************}
{*********** Dette er KUN pga. nød *************}
HeltalsDel := 58319321.365;
if (Ant_Dec = 2) and (abs(Tal_real) = HeltalsDel) then
begin
if (Tal_real >= 0.0) then
begin
Tal_real := 58319321.37;
end
else
begin
Tal_real := -58319321.37;
end;
Exit;
end;
{***********************************************}
>3
Problemet er, at det fra starten er programmeret med Real som den gængse variabeltype og der aldrig har været ressourcer og tid til at foretage en udrensning i koden. Faldt netop over funktionen ovenfor i forbindelse med en sag om nogle differencer, der langsomt hober sig op pga. den dårlige præcision i Real. Programmet ligger de samme tal sammen to forskellige steder og kommer frem til to forskellige resultater... :(
Problemet er, at det fra starten er programmeret med Real som den gængse variabeltype og der aldrig har været ressourcer og tid til at foretage en udrensning i koden. Faldt netop over funktionen ovenfor i forbindelse med en sag om nogle differencer, der langsomt hober sig op pga. den dårlige præcision i Real. Programmet ligger de samme tal sammen to forskellige steder og kommer frem til to forskellige resultater... :(
#5
Real er synonym for double i nyere Delphi (real48 er typen for den gamle 6 byte floating point).
Men jeg tvivler på at et skift fra gammel real ny real48 til double er den rigtige løsning.
Det giver lidt ekstra præcision at skifte fra 6 til 8 bytes floating point. Men jeg er ret overbevist om at problemet kan opstå i alle floating point.
Og dermed at løsningen er at skifte til fixed point.
Real er synonym for double i nyere Delphi (real48 er typen for den gamle 6 byte floating point).
Men jeg tvivler på at et skift fra gammel real ny real48 til double er den rigtige løsning.
Det giver lidt ekstra præcision at skifte fra 6 til 8 bytes floating point. Men jeg er ret overbevist om at problemet kan opstå i alle floating point.
Og dermed at løsningen er at skifte til fixed point.
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.