C# OxyPlot绘制圆不正确(带间隙)

C# OxyPlot绘制圆不正确(带间隙),c#,math,oxyplot,C#,Math,Oxyplot,我打了这个: myModel.Series.Add(new FunctionSeries((x) => Math.Sqrt(16 - Math.Pow(x, 2)), -4, 4, 0.1, "x^2 + y^2 = 16") { Color = OxyColors.Red }); myModel.Series.Add(new FunctionSeries((x) => - Math.Sqrt(16 - Math.Pow(x, 2)), -4, 4, 0.1) { Color = O

我打了这个:

myModel.Series.Add(new FunctionSeries((x) => Math.Sqrt(16 - Math.Pow(x, 2)), -4, 4, 0.1, "x^2 + y^2 = 16") { Color = OxyColors.Red });
myModel.Series.Add(new FunctionSeries((x) => - Math.Sqrt(16 - Math.Pow(x, 2)), -4, 4, 0.1) { Color = OxyColors.Red });
然后OxyPlot画了它:

如何修复它?

这是因为

Math.Sqrt(16 - Math.Pow(x, 2))
x=4
返回
NaN
,因为
16-数学.Pow(x,2)
是按双精度计算的。这意味着结果不完全等于0(本例中为-35527136788005E-14)。类似于
Math.Sqrt(-35527136788005e-14)
的负平方根未定义,如中所述

你可以通过禁止负数来解决这个问题。只需计算最大值,然后0

Math.Sqrt(Math.Max(16 - Math.Pow(x, 2), 0))

这是不对的@dlatikay。。。如果x为0,则结果有效。x=4无效。aaargh今天在同一个帖子上尴尬了两次:-)当然,谢谢。不管怎样,+1用于在答案中包含一个可能的解决方案,而不是仅仅指出错误。嗯,我不知道为什么数学。Sqrt不接受带4的表达式,但接受带-4的表达式,但带
double.Epsilon
的解有效。原因是16-4²=16-16=0,Sqrt(0)给出NaN。我从@fruchtzwerg链接的MSDN文章中看不到这一点,因为它说0的sqrt是0,我的袖珍计算器也这么认为。我怀疑这个问题的另一个原因。当我们查看OxyPlot计算图表的源代码时,我们发现它们已经添加了,因此参数实际上是否定的。感谢@dlatikay的回答-你完全正确。我的解释有点误导。我在OxyPlot代码中没有看到任何类型的ε,但我已经更新了我的答案,以正确解释该行为。谢谢