2011-12-04 15 views
6

sto eseguendo un programma in C++ su windows e su linux. l'output è pensato per essere identico. sto cercando di assicurarmi che le uniche differenze siano le differenze reali che si oppongono alle differenze di invarianza di lavoro. finora mi sono occupato di tutte le differenze che possono essere causate da \ r \ n differenze ma c'è una cosa che non riesco a capire.Firmato zero linux vs windows

nelle finestre mettere fuori c'è un 0.000 e in linux è -0.000

Se uno sa che cosa può essere che sta facendo la differenza?

thanx

+4

Difficile dire che non stai mostrando un pezzo di codice rilevante che emette quello :) – favoretti

+0

Non fa differenza, a prescindere da come lo vedi. Cosa farai con lo zero firmato/senza segno? Aggiungilo? Invertita? Dividi da questo? – FailedDev

+0

@FailedDev: fa la differenza. Pensa a una funzione che tende a 0, può provenire sia dalla parte negativa dell'asse y, sia dalla parte positiva dell'asse y. – ninjalj

risposta

1

Poiché nel formato in virgola mobile IEEE il bit di segno è separato dal valore, si hanno due valori diversi di 0, uno positivo e uno negativo. Nella maggior parte dei casi non fa differenza; entrambi gli zeri si confronteranno uguali e in effetti descrivono lo stesso valore matematico (matematicamente, 0 e -0 sono uguali). Dove la differenza può essere significativa è quando hai underflow e devi sapere se il underflow è avvenuto da un valore positivo o da un valore negativo. Inoltre se dividi per 0, il segno dell'infinito che ottieni dipende dal segno dello 0 (cioè 1/+ 0.0 danno + Inf, ma 1/-0.0 dà -Inf). In altre parole, molto probabilmente non farà la differenza per te.

Si noti tuttavia che il diverso output non significa necessariamente che il numero stesso è diverso. Potrebbe anche darsi che il valore in Windows sia anche -0.0, ma la routine di output su Windows non distingue tra +0.0 e -0.0 (dopo tutto sono uguali).

7

Probabilmente proviene dalle differenze nelle modalità di ottimizzatore ottimizza alcuni calcoli FP (che può essere configurabile - vedi esempio here); in un caso si ottiene un valore leggermente inferiore a 0, nell'altro leggermente di più. Entrambi in output sono arrotondati a 0.000, ma mantengono il loro segno "reale".

1

a meno di utilizzare le bandiere (non sicuri) come -ffast-math, il compilatore è limitato nelle ipotesi si può fare quando 'ottimizzare' IEEE-754 aritmetica. Innanzitutto controlla che entrambe le piattaforme utilizzino lo stesso arrotondamento.

Inoltre, se possibile, verificare che stiano utilizzando la stessa unità in virgola mobile. vale a dire, SSE vs FPU su x86. Quest'ultimo potrebbe essere un problema con le implementazioni di funzioni di libreria matematica - specialmente le funzioni trigonometriche/trascendentali.

+1

come posso controllare quale unità floating point stanno usando? – user690936

Problemi correlati