二等分法-C#

二等分法-C#,c#,.net,algorithm,math,bisection,C#,.net,Algorithm,Math,Bisection,我有一个名为二分法的函数,它接受4个参数,函数的委托,区间的开始和结束,以及用户对解的猜测。 以下是函数: publicstaticdouble-Bisection_方法(MyFun-fun,double-start,double) 结束,双重猜测) { 如果(乐趣(开始)*乐趣(结束)>0) { 控制台写入线(“错误输入”); 返回-1; } 双平均值、公差、符号; 平均值=(guess.HasValue)?guess.Value:((开始+结束)/2); 做 { 容差=Math.Abs(乐趣

我有一个名为二分法的函数,它接受4个参数,函数的委托区间的开始结束,以及用户对解的猜测。 以下是函数:

publicstaticdouble-Bisection_方法(MyFun-fun,double-start,double)
结束,双重猜测)
{
如果(乐趣(开始)*乐趣(结束)>0)
{
控制台写入线(“错误输入”);
返回-1;
}
双平均值、公差、符号;
平均值=(guess.HasValue)?guess.Value:((开始+结束)/2);
做
{
容差=Math.Abs(乐趣(结束)-乐趣(开始));
标志=乐趣(开始)*乐趣(平均值);
if(符号<0)
结束=平均值;
否则,如果(符号>0)
开始=平均值;
其他的
{
如果(乐趣(开始)==0)
返回启动;
否则返回结束;
}
平均值=(开始+结束)/2;
}
而(公差>0.0001);
返回端;
}
现在我想处理一些案件:

1-我们可以输入一个负数作为间隔的开始吗?如果是这样,我们如何处理sqrt


2-如果用户输入从零开始的间隔,并且我传递给代理的函数有Ln()或Log(),我们如何处理这个问题?

问题是:如果
fun
Math.Sqrt(double)
并且
start
是负数,那么
fun(start)
NaN
也是
fun(start)*乐趣(结束)
,但
NaN>0
的计算结果为
false

您需要明确检查
NaN

double fstart = fun(start);
double fend = fun(end);
if ( double.IsNaN(fstart) || double.IsNaN(fend) || fstart * fend > 0 )
{
    Console.WriteLine("wrong Entry");
    return -1; // this may not be the best way to report an error
}

此外,您可能希望在循环内检查
double.IsNaN(fun(avg))
以处理例如
fun=x=>x*Math.Sqrt(x*x-1)
start<-1
下一步,当然,您可以处理这两种情况。只需实现您已有的文本描述。我的意思是,你是否也写了现有的代码?关于可空双精度,顺便说一句,它是有效的,程序正在运行。这个方法的设计和实现有很多问题,很难知道从哪里开始。如果你想得到关于如何改进的好建议,那么就让它充分发挥作用,尽可能地改进它,然后把它发布在代码审查网站上。是的,我说的是C#here and double?至于你的问题:(1)你设计了一个方法,它有一个先决条件,即在整个范围内定义函数。你的问题是“如果我有一个函数不满足我的先决条件怎么办?”好吧,你设计了先决条件。如果您需要不同的先决条件,请说明先决条件和随后的后决条件。(2)相同的答案;如果希望先决条件是函数在打开间隔内有效,则更改方法,使其仅在打开间隔内探索函数。
double fstart = fun(start);
double fend = fun(end);
if ( double.IsNaN(fstart) || double.IsNaN(fend) || fstart * fend > 0 )
{
    Console.WriteLine("wrong Entry");
    return -1; // this may not be the best way to report an error
}