Sto leggendo attraverso il new C++ FAQ e vedo che anche se x == y
per double x, y;
, allora è possibile che:Il cast e il compito eliminano davvero ogni precisione extra dei float?
std::cos(x) == std::cos(y)
per valutare a false
. Questo perché la macchina può avere un processore che supporta la precisione estesa, in modo che una parte di ==
sia un numero a 64 bit mentre l'altra sia un numero a 80 bit.
Tuttavia, l'esempio successivo sembra essere corretto:
void foo(double x, double y)
{
double cos_x = cos(x);
double cos_y = cos(y);
// the behavior might depend on what's in here
if (cos_x != cos_y) {
std::cout << "Huh?!?\n"; // You might end up here when x == y!!
}
}
quanto ne read on en.cppreference.com here:
Fusioni e assegnazione striscia via qualsiasi gamma estraneo e precisione: questi modelli l'azione memorizzando un valore da un registro FPU a precisione estesa in una posizione di memoria di dimensioni standard.
Quindi, assegnando:
double cos_x = cos(x);
double cos_y = cos(y);
dovrebbe tagliare l'eventuale precisione in più e rendere il programma perfettamente prevedibile.
Quindi, chi ha ragione? Le domande frequenti su C++ o en.cppreference.com?
Nel tuo esempio, certo, la precisione extra del risultato di 'cos (v)' può essere rimossa. Ciò non significa che la precisione extra di 'v' in' cos (v) 'non cambi quel risultato. Generalmente, le operazioni in virgola mobile sono tutte specifiche della piattaforma, quindi spetta al compilatore avere i flag e la documentazione di quale sarà il comportamento in virgola mobile. Ad esempio, molti compilatori ti permetteranno di dire "Voglio una rigida semantica a virgola mobile a 32 bit", quindi nessuna di queste cose si applica. – GManNickG
Elaborazione sul commento @GManNickG, per esempio GCC ha le opzioni '-ffloat-store' e' -fexcess-precision = 'per scegliere il comportamento desiderato. – rodrigo
BTW: Trovo il tag di lingua-avvocato strano qui. Lo standard C++ non è realmente il documento di riferimento per il punto mobile, e dubito che a tutti * piaccia * passare attraverso le specifiche IEEE/Intel. Di nuovo, si riduce fondamentalmente alla sua "implementazione/hardware". Ma generalmente la premessa della domanda si basa su due diverse fonti non normative, quindi che cosa dovremmo essere il giuramento qui? –