我正在渲染一个插值曲线:
e.Graphics.DrawLines(new Pen(Color.Red),_interpolationPoints.ToArray());
有时会抛出一个OverflowException.
_interpolationPoints数组的检查显示科学记数法中的一些非常大的值. {X = 0.0 Y = -1.985174E 10}
我怀疑Y = -1.985174E 10是GDI无法处理的值.很好,但是我可以绘制的最大/最小X和Y值是多少,因此限制数据(并警告用户),而不是在绘制过程中捕获溢出异常.是否记录了限制?
例如,我想做这样的事情:
if (yVal < float.MinValue || yval > float.MaxValue) throw new OverflowException("Interpolation value too large to be rendered.");
在_interpolationPoints数组的群体中,并停止进程. (float mix / max不工作btw,我仍然得到例外)
解决方法
好的,我需要知道,所以我逐渐测试,并提出了这些限制:
positive: 1,073,741,951 negative: -1,760
我使用的代码看起来像这样:
int lastGoodVal = 0; for (int i = -1073000000; i > -1073832999; i -= 1) { g.DrawLine(Pens.Blue,new Point(0,0),i)); lastGoodVal = i; }
上面的循环是最后的测试,通过早期测试建立的一系列负值,逐步上升1.正如你所看到的,lastGoodVal拥有最后一次成功的绘画迭代,因此我将用作一个常数的真正限制.
我试图将这些数字与.NET原语中的值相关联,但不能.每个限制都接近2 ^ 30的值,但不完全符合.任何其他的见解将不胜感激.
我也只用DrawLine方法测试. API中的其他功能可能存在不同的限制,但我还没有机会探索.
另外,在完成了这个实验之后,然后Googling的值为1073741951,我遇到了this article,这与我的发现相关.我也是found this在某种类型的Mono代码存档,它提到了一个接近但与浮动限制的精确相关性.