///JJ skrev:
> Function AsymUp(ByVal X As Double, _
> Optional ByVal Factor As Double = 1) As Double
> Dim Temp As Double
> Temp = Int(X * Factor)
> AsymUp = (Temp + IIf(X = Temp, 0, 1)) / Factor
> End Function
>
> Function SymUp(ByVal X As Double, _
> Optional ByVal Factor As Double = 1) As Double
> Dim Temp As Double
> Temp = Fix(X * Factor)
> SymUp = (Temp + IIf(X = Temp, 0, Sgn(X))) / Factor
> End Function
Det var fint. Jeg var ikke klar over at MS har en artikel liggende
omkring dette emne, MEN...
De gør jo netop det, som jeg antyder kan være et problem: Forventer at
hvis tallet er (læs: er meningen at det skal være) et helt tal, f.eks.
1, kan det godt være at den binære repræsentation - efter at der er
foretaget adskillige beregninger på variablen - rent faktisk er noget
i retning af 0,9999999999999... (op til den maksimalt repræsenterbare
antal betydende decimaler).
Med andre ord vil en Fix(X) _ikke_ give 1 som forventet men 0, og en
sammenligning X=1 vil være falsk.
Et klassisk eksempel er X=1/3*3, som altså bare ikke duer mere, fordi
beregningsrutinerne faktisk er så smarte, at de foretager små
justeringer undervejs som klarer mange af den slags småproblemer, men
så lad os da producere et lidt mere komplekst eksempel til formålet:
y = 49
x = 2 / y
x = 3 - x * y
Værdien i x burde nu være 1, men det er den ikke. Den er lige nøjagtig
en lille bitte minimal mikroskopisk smule større end 1.
Udfør derefter SymUp og AsymUp på x, og 1-tallet vil nu blive rundet
op til 2. Det er ikke særlig rart, når man forventer et 1-tal.
Problemet er ganske kort berørt i slutningen af den MS artikel, som du
henviser til:
"Since not all fractional values can be expressed exactly, you might
get unexpected results because the display value does not match the
stored value."
Grundet til at jeg skrev indlægget i gruppen var netop for at høre
nogle forslag fra nogle, som aktivt har taget stilling til denne
problemstilling og fundet på nogle brugbare løsning. Jeg mener at MS
stikker hovedet lidt i busken, ved kun at berøre emnet så kort som de
gør i den eller udmærkede artikel, som du henviste til.
Er der nogen med et bud...
....eller stikker alle andre også hovedet i busken, krydser fingrene og
tænker "det går nok". Hvis der opstår en fejl, skyder vi bare skylden
på brugeren...
-------
Tomas