09/01/2021, 20:16
10/01/2021, 01:44
1+eps>1
da come risultato 1
cioè true.10/01/2021, 16:57
10/01/2021, 20:11
1+1e-15
. Troverai un 1 nell'ultima cifra che vedi nel terminale. D'altronde, l'unità di roundoff è dell'ordine di $10^(-16)$, ecco perché non noti la differenza, che però c'è.
11/01/2021, 13:59
Calcola $\log(1+x)$ per $x$ molto piccolo.
1+x == 1
. Perciò $\log(1+x)=\log(1)=0$: che è clamorosamente errato. Infatti, per $x = 10^(-18)$, hai che $\log(1+x) \approx 10^(-18)$ in aritmetica esatta, non $0$ come invece trovi sul tuo pc! L'errore relativo infatti è molto grande $E_r(x)\approx\frac{10^(-18)-0}{10^(-18)} = 1$. #include <iostream>
#include <cmath>
struct NonAccett{
std::string messaggio;
NonAccett(std::string s): messaggio{std::move(s)} {}
const char* what() const {return messaggio.c_str();}
};
double log1px(const double& x){
if (x<=-1) {
throw NonAccett(std::to_string(x) + " è minore di -1, non accettabile");
}
if (std::fabs(x)>1e-4) {
return log(1+x); //non ci sono grandi problemi di accuratezza
}
return x*(1 - 0.5*x);
}
int main(){
const double x{1e-15};
try {
double test{log1px(x)};
std::cout << test << std::endl;
return 0;
} catch (const NonAccett& tp) {
std::cout << tp.what() <<std::endl;
return 1;
}
}
Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000—
Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.
Powered by phpBB © phpBB Group - Privacy policy - Cookie privacy
phpBB Mobile / SEO by Artodia.