Flyte verdier oppfører annerledes over utgivelsen og debug bygger

stemmer
6

Min søknad er å generere forskjellige flytende kommaverdier når jeg kompilere det i frigjøringstilstand, og i feilsøkingsmodus. Den eneste grunnen til at jeg fant ut er at jeg sparer en binær sporingsloggen og en fra utgivelsen build er aldri så litt av fra debug bygge, ser det ut som de to nederste bitene av de 32 bit float verdier er annerledes med 1/2 av tilfellene.

Vil du vurdere denne forskjellen for å være en feil eller vil denne type forskjell forventes. Vil dette være en kompilator feil eller et internt bibliotek bug.

For eksempel:

LEFTPOS and SPACING are defined floating point values.
float def_x;
int xpos;

def_x = LEFTPOS + (xpos * (SPACING / 2));

Spørsmålet er i forhold til X360 kompilatoren.

Publisert på 26/09/2008 klokken 18:26
kilden bruker
På andre språk...                            


9 svar

stemmer
2

Det er ikke en bug. Enhver flytende punkt uperation har en viss unøyaktighet. I Utløsermodus, vil optimalisering endre rekkefølgen av operasjonene, og du vil få en litt annerledes resultat. Forskjellen bør være liten, skjønt. Hvis det er stort du kan ha andre problemer.

Svarte 26/09/2008 kl. 18:29
kilden bruker

stemmer
11

Utløserfunksjon kan ha en annen FP strategi sett. Det er forskjellige flyttall aritmetiske moduser avhengig av nivået av optimalisering du ønsker. MSVC, for eksempel, har strenge, raske og presise moduser.

Svarte 26/09/2008 kl. 18:29
kilden bruker

stemmer
3

Jeg hjalp en medarbeider finne en kompilator bryter som var annerledes i utgivelsen vs. debug bygger som var årsaken hans forskjeller.

Ta en titt på / fp (Angi flyttalls Behavior) .

Svarte 26/09/2008 kl. 18:33
kilden bruker

stemmer
1

Ikke en bug. Denne typen forskjellen er å være forventet.

For eksempel har enkelte plattformer flyte registre som bruker flere bit enn det som er lagret i minnet, slik at holde en verdi i registeret kan gi en litt forskjellig resultat sammenlignet med lagring i minnet og re-lasting fra minnet.

Svarte 26/09/2008 kl. 18:33
kilden bruker

stemmer
0

Dette avviket kan meget vel være forårsaket av kompilatoren optimalisering, som vanligvis gjøres i utløserfunksjon, men ikke i feilsøkingsmodus. For eksempel, kan kompilatoren omordne noen av operasjonene for å øke hastigheten på utførelse, noe som kan tenkes å forårsake en liten forskjell i den flytende punkt resultat.

Så, jeg vil si mest sannsynlig er det ikke en bug. Hvis du er virkelig bekymret for dette, prøv å slå på optimalisering i Debug-modus.

Svarte 26/09/2008 kl. 18:34
kilden bruker

stemmer
4

Jeg vet at på PC, flyt registre er 80 bits bred. Så hvis en beregning er gjort helt i FPU, får du fordelen av 80 biter av presisjon. På den annen side, hvis et mellomresultat blir flyttet ut i et vanlig register og tilbake, blir den avkortet til 32 biter, noe som gir forskjellige resultater.

Nå anser at en utgivelse bygge vil ha optimaliseringer som holder middels resultater i FPU registre, mens en debug bygge vil trolig naivt kopiere mellomresultater fram og tilbake mellom minne og registre - og der du har din forskjell i oppførsel.

Jeg vet ikke om dette skjer på X360 for eller ikke.

Svarte 26/09/2008 kl. 18:37
kilden bruker

stemmer
0

Som andre nevnte, flytende tallsregistre har høyere presisjon enn flottører, slik at nøyaktigheten av den endelige resultatet avhenger av register tildeling.

Hvis du trenger konsistente resultater, kan du gjøre de variablene volatile, noe som vil resultere i tregere, mindre presise, men konsistente resultater.

Svarte 26/09/2008 kl. 21:51
kilden bruker

stemmer
2

I tillegg til de forskjellige flyttalls modi andre har påpekt, kan SSE eller lignende vektor optimalisering bli aktivert for frigivelse. Konvertering flyttallsaritmetikk fra vanlige registre til vektorregistre kan ha en effekt på de nedre biter av resultatene, som vektorregistre vil generelt være mer snever (færre bits) enn standard flyttallsregistre.

Svarte 26/09/2008 kl. 21:57
kilden bruker

stemmer
0

Hvis du setter en kompilator bryter som tillot kompilatoren å endre rekkefølgen flyttallsoperasjoner, - f.eks / fp: fort - så åpenbart det er ikke en bug.

Hvis du ikke har angitt et slikt bytte, så er det en bug - C og C ++ standarder tillater ikke kompilatorer å omorganisere driften uten din tillatelse.

Svarte 25/11/2008 kl. 19:52
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more