Tutto è nel titolo. Come verificare un possibile overflow quando si utilizzano le due funzioni exp() e log()?Come prevenire l'overflow quando si usano le funzioni matematiche usuali exp() log()?
risposta
Per espandere la risposta di @TheOtherGuy, è possibile annullare l'operazione in caso di overflow.
#include <stdio.h>
#include <math.h>
#include <errno.h>
int main(void)
{
double param, result;
errno = 0;
param = 1e3;
result = exp (param);
if (errno == ERANGE) {
printf("exp(%f) overflows\n", param);
result = param;
}
printf ("The exponential value of %f is %f.\n", param, result);
return 0;
}
#include <errno.h>
Quando si verifica un oferflow, quindi errno è impostato ERANGE.
La prossima volta, fare il vostro lavoro prima di chiedere.
Googling: "C++ exp" ha prodotto questo come il primo risultato http://www.cplusplus.com/reference/cmath/exp/
Al centro della pagina, v'è esattamente quello che stai cercando.
L'obiettivo è quello di verificare la presenza di troppo pieno prima che si verifichi. Altrimenti, verrà generato un comportamento non definito. – WildThing
È più facile di quanto pensi. Prova e se errno è impostato su ERANGE prova ancora con valori diversi. Questo approccio è * semplice *, * economico * e tuttavia * efficace *. –
Questo è un post test per l'overflow che non è applicabile al mio problema poiché gli ingressi variano ogni volta. Voglio controllare l'eventuale overflow prima che si verifichi – WildThing
Il modo migliore per controllare in anticipo l'overflow è farlo in modo intelligente, caso per caso.
Usando la vostra conoscenza dei logaritmi ed esponenti, si dovrebbe essere in grado di identificare potenziali overflow utilizzando le proprietà come INT_MAX
: esaminare questi C++ Limitations
ho gettato un campione di massima C++ esecuzione insieme, a patto di sapere in anticipo quali limiti si sta tentando da seguire.
#include <iostream>
// nTh root calculator
bool is_exp_overflow(int input_val, int exponent)
{
my_max = pow(INT_MAX, (1/exponent);
if (input_val > my_max)
{
return true;
}
else
return false;
}
void runExp(int my_input, int my_exp)
{
// Do maths
}
int main()
{
int my_input = 0;
int my_exp = 0;
std::cout << "Enter test value\n";
std::cin >> my_input;
std::cout << "Enter test exponent\n";
std::cin >> my_exp;
bool exp_unsafe = 1;
exp_unsafe = is_exp_overflow(my_input, my_exp);
if (!exp_unsafe)
runExp(my_input, my_exp);
else
std::cout << "Code is unsafe\n";
return 0;
}
Se stai cercando di catturare gli errori post mortem, esaminare errno in range.
Per la movimentazione exp():
Basta confrontare con una variabile che si assegna il login (FLT_MAX). FLT_MAX è il più grande float. È possibile eseguire questa operazione prima del calcolando un exp(). Perché log() è inverso di exp().
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
float a=1E+37f; // an example of maximum finite representable floating-point number.
//max value can change with platform so,
//either use definitions or use a function you wrote
// a= getMaxFloat(); or a=FLT_MAX
float b=log(a); // limit of float to give in exp();
float c=3242325445.0f; // test variable
cout << "Hello world!" << endl;
if(c>b){cout<<"you should not take exp of "<<c<<endl;}else{cout<<"go on"<<endl;}
return 0;
}
Per la gestione di log():
1) Non è possibile Everflow log (x) prima traboccante x. (per il limite superiore)
2) La precisione di Float/Double (x) non è sufficiente per l'overflow per l'infinito negativo per log (x).
3) Assicurarsi che x sia maggiore di zero.
Da dove hai preso il tuo galleggiante più grande? È dipendente dalla piattaforma e ci sono modi per ottenerlo per qualsiasi piattaforma. – juanchopanza
Quindi dovrebbe controllare il limite della sua piattaforma prima di controllare un overflow prima del calcolo. –
Dovresti suggerirlo nella tua risposta invece di citare un numero strano e affermare che è il più grande float :) – juanchopanza
Meglio prevenire, si può prendere l'eccezione:
try {
z=exp(n);
} catch (...) {
puts("Can't calcute exp...");
}
... in C++. In c non ci sono eccezioni. – urzeit
'exp' fa ** not ** genera un'eccezione su overflow. Esiste ** un'eccezione a virgola mobile **, ma si tratta di un diverso significato di "eccezione" specifica per virgola mobile. Non ha nulla a che fare con le eccezioni C++ –
- 1. Risolvi le funzioni matematiche PL/SQL
- 2. gdb dà uscita strano quando si usano funzioni math.h
- 3. Editor con funzioni matematiche
- 4. prestazioni Haskell quando si usano le classi e le istanze
- 5. Risultati errati quando si usano le funzioni `get_ancestors` da` django-mptt`
- 6. Come si usano le spline in pythonOCC?
- 7. Identificatore sconosciuto quando si usano le costanti C#
- 8. C'è una penalità di efficienza quando si usano le funzioni interne di Scala all'interno di funzioni ricorsive non tail?
- 9. overflow: nascosto non funziona quando si usano le tabelle
- 10. Quando si usano le esuberanti ctags quali opzioni usare?
- 11. Cosa significa() in un'espressione lambda quando si usano le azioni?
- 12. Quando si usano vararg in Java?
- 13. Libreria di funzioni matematiche speciali Java
- 14. C#: funzioni matematiche generiche (Min, Max etc.)
- 15. Come si applicano le operazioni matematiche alle dimensioni Android?
- 16. Sovraccarico Python funzioni matematiche usando Cython
- 17. Quando si usano oggetti funzione in C++?
- 18. Come evitare le funzioni annidate quando si utilizza AJAX?
- 19. Come si relaziona con le dipendenze quando si usano i modelli TeamCity?
- 20. Come rimuovere le stringhe doc quando si usano le distutils Cython?
- 21. Precisione richiesta dalle funzioni matematiche GNU GCC?
- 22. La spaziatura di Mathematica degli accenti di simboli quando si compongono le formule matematiche
- 23. Quando utilizzare le proprietà invece di funzioni
- 24. Le funzioni matematiche delle espressioni costanti vengono precalcolate in fase di compilazione?
- 25. Come progettare le sottoview per UIScrollView quando si usano gli storyboard per iOS5?
- 26. In Mathematica. Quando si usano le immagini come vertici in GraphPlot, come posso evitare che le immagini si sovrappongano?
- 27. Come si usano le icone di fontello nel mio css?
- 28. Come sottoclasse il Navigation Controller quando si usano gli storyboard?
- 29. Prestazioni Pow() vs. exp()
- 30. Come si usano le sezioni in app.config C# 4.0?
penso che tu abbia torto, per creare un programma conforme devi testare l'overflow prima di generare detto overflow. guarda questo http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc – WildThing
@ user2114690 buon link, grazie –
Aggiunto a quanto detto da @James Kanze, penso che io era sbagliato. la tua soluzione è corretta Grazie – WildThing