그래서이 작은 창을 사인파를 그리는 프로그램으로 만들었지 만 sin(x)^x
과 같은 특정 기능을 오버플로했습니다. 이 코드를 검토하고이 사실을 파악하는 데 도움이됩니다.왜이 C# 함수는 System.Drawing 오버플로를 사용하여 사인파를 그리는가?
private void button1_Click(object sender, EventArgs e)
{
if (Completed) return;
Completed = true;
Graphics g = this.CreateGraphics();
Pen pen = new Pen(Brushes.Black, 2.0F);
float x1 = 0;
float y1 = 0;
float y2 = 0;
float yEx = 300;
float eF = 50;
for (float x = 0; x < Width; x += 0.005F)
{
y2 = (float)Math.Pow(Math.Sin(x) , x);
g.DrawLine(pen, x1 * eF, y1 * eF + yEx, x * eF, y2 * eF + yEx);
x1 = x;
y1 = y2;
}
}
내가 실행, 그것은 조금 동안 실행 한 다음이 표시됩니다
모든 기여는 감사합니다!
앞에'float'의 최대 값 인 Int32와 동일합니다. 결과가 2,147,483,647보다 큰 경우 오버플로 오류가 발생합니다. 'double '을 사용해 보셨습니까? (이것은'Int64'와 동일한 최대 값 - 9,223,372,036854775807입니까?)? 또는 오버플로를 처리 할 값을 확인하십시오. – Tim
입력 내용을 펜으로 확인하지 않습니다. 캔버스의 테두리 안에 있는지 확인해야합니다. 실제로 캔버스를 그리는 것이 좋지 않기 때문입니다. – TyCobb
그럼'Width'의 값은 무엇입니까? 이것을 Visual Studio로 떨어 뜨리고 1920과 같은 값을 사용하면'y2 '를 출력하면 많은 결과를 얻을 수 있습니다 (많은 경우 NaN입니다). 그러나 오버플로가 발생하지 않습니다. 그리고 그것은 의미가 있습니다. 정말로 'sin (x)^x'의 범위는 (-1, 1)로 제한 될 것이므로 결코 넘치지 않아야합니다. – Abion47