Error handling GSL:错误报告
我想使用GSL进行集成 但是,我发现没有一种方便的方式来集成功能 (示例中的函数f) 可以向集成器报告错误。我想集成一个函数,它本身是一个可能失败的集成的结果。这是我的示例程序Error handling GSL:错误报告,error-handling,integration,gsl,Error Handling,Integration,Gsl,我想使用GSL进行集成 但是,我发现没有一种方便的方式来集成功能 (示例中的函数f) 可以向集成器报告错误。我想集成一个函数,它本身是一个可能失败的集成的结果。这是我的示例程序 #include <stdio.h> #include <math.h> #include <gsl/gsl_integration.h> #include <gsl/gsl_errno.h> double f (double x, void * params) {
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>
double f (double x, void * params) {
GSL_ERROR("test error",GSL_FAILURE);
return 0.0;
}
int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);
double result, error;
gsl_function F;
F.function = &f;
gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
w, &result, &error);
printf ("status = %d\n", status);
status = GSL_FAILURE;
printf ("status = %d\n", status);
gsl_integration_workspace_free (w);
return 0;
}
#包括
#包括
#包括
#包括
双f(双x,空*参数){
GSL_错误(“测试错误”,GSL_故障);
返回0.0;
}
内部主(空)
{
gsl_集成_工作空间*w=gsl_集成_工作空间_分配(1000);
双重结果,错误;
gsl_函数F;
函数=&F;
gsl_设置_错误_处理器_关闭();
int status=gsl_集成_qags(&F,0,1,0,1e-7,1000,
w、 结果和错误);
printf(“状态=%d\n”,状态);
状态=GSL_故障;
printf(“状态=%d\n”,状态);
gsl_集成_工作空间_自由(w);
返回0;
}
导致输出
状态=0
状态=-1
我认为积分器应该停止并返回我的错误代码。我怎样才能做到这一点
非常感谢你的帮助
2011年04月27日:布莱恩·高夫告诉我后,我也尝试过这种变体
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>
double f (double x, void * params) {
GSL_ERROR("test error",GSL_FAILURE);
return GSL_NAN;
}
int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);
double result, error;
gsl_function F;
F.function = &f;
gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
w, &result, &error);
printf ("status = %d\n", status);
status = GSL_FAILURE;
printf ("status = %d\n", status);
gsl_integration_workspace_free (w);
return 0;
}
#包括
#包括
#包括
#包括
双f(双x,空*参数){
GSL_错误(“测试错误”,GSL_故障);
返回GSL_NAN;
}
内部主(空)
{
gsl_集成_工作空间*w=gsl_集成_工作空间_分配(1000);
双重结果,错误;
gsl_函数F;
函数=&F;
gsl_设置_错误_处理器_关闭();
int status=gsl_集成_qags(&F,0,1,0,1e-7,1000,
w、 结果和错误);
printf(“状态=%d\n”,状态);
状态=GSL_故障;
printf(“状态=%d\n”,状态);
gsl_集成_工作空间_自由(w);
返回0;
}
这也无济于事。现在,我将填写一份bug报告。有点粗糙,但我可能会让您的函数存储一些标志。当遇到错误时,它将设置标志并为所有后续计算返回零。然后,在您集成它之后,您可以检查这个标志,看看结果是否有效。有点粗糙,但我可能会让您的函数存储一些标志。当遇到错误时,它将设置标志并为所有后续计算返回零。然后,在集成它之后,您可以检查此标志以查看结果是否有效。如何为函数编写一个包装器,返回指向结构的指针,其中包含函数结果和错误状态?或者,如果你使用C++,这个封装可以使用对象……< /p> 来写一个函数的包装器,它将指针返回到一个包含函数结果和错误状态的结构。或者如果你使用C++,这个封装可以用对象……< /p> < p>感谢薛斌武从GSL邮件列表中解决的问题: 嗨 GSL_错误本身是一个宏,看起来像
gsl_error (reason, __FILE__, __LINE__, gsl_errno);
return gsl_errno;
函数在返回NAN之前已经返回,因为GSL_错误
已经打过电话了。关闭处理程序只需让第一行执行即可
没有什么。默认错误处理程序在打印后中止程序
错误消息
我不认为这是一个错误。也许您可以编写自己的错误处理程序
来解决你的问题。例如,您可以使用“goto”跳出
gsl_integration_qags,或设置一些全局变量以指示
积分结果不正确
PS:我相信这个宏就是你需要的
宏:GSL_ERROR_VAL(原因、GSL_errno、值)
此宏与GSL_ERROR相同,但返回用户定义的值
值,而不是错误代码。它可以用于数学计算
返回浮点值的函数
下面的示例演示如何在数学表达式中返回NaN
使用GSL_ERROR_VAL宏的奇点
if (x == 0)
{
GSL_ERROR_VAL("argument lies on singularity",
GSL_ERANGE, GSL_NAN);
}
所以我根据
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>
double f (double x, void * params) {
// return GSL_NAN;
GSL_ERROR_VAL ("argument lies on singularity", GSL_ERANGE, GSL_NAN);
}
int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);
double result, error;
gsl_function F;
F.function = &f;
gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
w, &result, &error);
printf ("status = %d\n", status);
status = GSL_FAILURE;
printf ("status = %d\n", status);
gsl_integration_workspace_free (w);
return 0;
}
#包括
#包括
#包括
#包括
双f(双x,空*参数){
//返回GSL_NAN;
GSL_ERROR_VAL(“论点在于奇点”,GSL_ERANGE,GSL_NAN);
}
内部主(空)
{
gsl_集成_工作空间*w=gsl_集成_工作空间_分配(1000);
双重结果,错误;
gsl_函数F;
函数=&F;
gsl_设置_错误_处理器_关闭();
int status=gsl_集成_qags(&F,0,1,0,1e-7,1000,
w、 结果和错误);
printf(“状态=%d\n”,状态);
状态=GSL_故障;
printf(“状态=%d\n”,状态);
gsl_集成_工作空间_自由(w);
返回0;
}
一切都按预期进行…感谢GSL邮件列表中的吴学斌,问题得以解决: 嗨 GSL_错误本身是一个宏,看起来像
gsl_error (reason, __FILE__, __LINE__, gsl_errno);
return gsl_errno;
函数在返回NAN之前已经返回,因为GSL_错误
已经打过电话了。关闭处理程序只需让第一行执行即可
没有什么。默认错误处理程序在打印后中止程序
错误消息
我不认为这是一个错误。也许您可以编写自己的错误处理程序
来解决你的问题。例如,您可以使用“goto”跳出
gsl_integration_qags,或设置一些全局变量以指示
积分结果不正确
PS:我相信这个宏就是你需要的
宏:GSL_ERROR_VAL(原因、GSL_errno、值)
此宏与GSL_ERROR相同,但返回用户定义的值
值,而不是错误代码。它可以用于数学计算
返回浮点值的函数
下面的示例演示如何在数学表达式中返回NaN
使用GSL_ERROR_VAL宏的奇点
if (x == 0)
{
GSL_ERROR_VAL("argument lies on singularity",
GSL_ERANGE, GSL_NAN);
}
所以我根据
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_errno.h>
double f (double x, void * params) {
// return GSL_NAN;
GSL_ERROR_VAL ("argument lies on singularity", GSL_ERANGE, GSL_NAN);
}
int main (void)
{
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);
double result, error;
gsl_function F;
F.function = &f;
gsl_set_error_handler_off();
int status = gsl_integration_qags (&F, 0, 1, 0, 1e-7, 1000,
w, &result, &error);
printf ("status = %d\n", status);
status = GSL_FAILURE;
printf ("status = %d\n", status);
gsl_integration_workspace_free (w);
return 0;
}
#包括
#包括
#包括
#包括
双f(双x,空*参数){
//返回GSL_NAN;
GSL_ERROR_VAL(“论点在于奇点”,GSL_ERANGE,GSL_NAN);
}
内部主(空)
{
gsl_集成_工作空间*w=gsl_集成_工作空间_分配(1000);
双重结果,错误;
gsl_函数F;
函数=&F;
gsl_设置_错误_处理器_关闭();
int status=gsl_集成_qags(&F,0,1,0,1e-7,1000,