Utilizzando std::exp
per calcolare e^-infinity
rendimenti -infinity
quando si utilizza la rappresentazione galleggiante di infinito e di costruzione di un binario x64 utilizzando Visual C++ 2013. Vorrei invitare per restituisce 0, che è ciò che accade con build Win32 o la versione di std::exp
che prende uno double
.std :: exp del galleggiante infinito negativo torna infinito negativo per x64 costruisce in Visual C++ 2013
Il seguente codice, creato come x64, illustra il problema.
#include <limits>
#include <iostream>
int main(const int argc, const char** argv) {
std::cout << "exp of float -infinity: " << std::exp(-std::numeric_limits<float>::infinity()) << std::endl;
std::cout << "exp of double -infinity: " << std::exp(-std::numeric_limits<double>::infinity()) << std::endl;
}
opzioni della riga di comando per la compilazione (presi da Visual Studio):
/GS /Wall /Gy /Zc:wchar_t /Zi /Gm- /Od /sdl /Fd"x64\Release\vc120.pdb" /fp:precise /D "_MBCS" /errorReport:prompt /WX /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\NumericLimitsTest.pch"
uscita di cui sopra:
exp of float -infinity: -1.#INF
exp of double -infinity: 0
Perché accade questo?
Questo è un bug; è stato risolto nelle librerie di runtime di Visual C++ 2015. –
@JamesMcNellis - non è questa la risposta definitiva? –