Итак, я сделал эту небольшую программу окон, которая рисует синусоидальную волну, но когда я помещаю некоторые функции, такие как 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,036,854,775,807)? Или проверите значения для обработки переполнения. – Tim
Вы не проверяете свои входы в ручку. Вы должны убедиться, что они находятся в пределах холста, потому что на самом деле это не похоже на рисование в ничто. – TyCobb
И что такое значение 'Width'? Отбрасывая это в Visual Studio и используя значение 1920, тогда печать 'y2' дает мне много результатов (многие из них« NaN'), но я никогда не получаю переполнение. И это имеет смысл, на самом деле - диапазон 'sin (x)^x' будет ограничен (-1, 1), поэтому он никогда не должен переполняться. – Abion47