所有都在标题中。使用exp()和log()两个函数时如何检查可能的溢出?
答案 0 :(得分:12)
#include <errno.h>
当出现一个流量时, errno 设置为 ERANGE 。
下次,在做问之前做好功课。
谷歌搜索:“c ++ exp”将此作为第一个结果返回 http://www.cplusplus.com/reference/cmath/exp/
在页面中间,您可以找到正确的内容。
答案 1 :(得分:7)
要扩展@TheOtherGuy的答案,您可以在发生溢出时取消操作。
#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;
}
答案 2 :(得分:2)
事先检查溢出的最佳方法是根据具体情况智能地进行检查。
利用您对数和指数的知识,您应该能够使用INT_MAX
等属性识别潜在的溢出:检查这些C++ Limitations
我把一个粗略的示例c ++执行放在一起,假设你事先知道你试图遵循的限制。
#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;
}
如果您希望捕获错误 post mortem ,请检查errno in range。
答案 3 :(得分:2)
对于exp()处理:
只需与您分配给日志的变量(FLT_MAX)进行比较。 FLT_MAX是最大的浮动。 你可以在之前计算exp()。因为 log()与 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;
}
对于log()处理:
1)在溢出x之前,你不能永远流动log(x)。 (上限)
2)Float的/ Double(x)精度不足以溢出到log(x)的负无穷大。
3)确保x大于零。
答案 4 :(得分:1)
比预防更好,你可以捕获异常:
try {
z=exp(n);
} catch (...) {
puts("Can't calcute exp...");
}