mboost-dp1

Værste hack N.O.G.E.N.S.I.N.D.E


Gå til bund
Gravatar #1 - cnr
31. jan. 2017 12:55
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;
{***********************************************}
Gravatar #2 - CBM
31. jan. 2017 14:03
Lækkert
Gravatar #3 - arne_v
1. feb. 2017 03:16
#1

Det ligner noget hvor der bør skiftes data type fra floating point til noget eksakt.
Gravatar #4 - gramps2
1. feb. 2017 07:06
Og det er kun dét der tal som giver problemer? Wow.
Gravatar #5 - cnr
1. feb. 2017 07:12
>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... :(
Gravatar #6 - arne_v
1. feb. 2017 14:15
#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.

Gå til top

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.

Opret Bruger Login