Другие языки программирования и технологии

C# Почему const uint SIZE не воспринимается массивом, как константа, а int работает? Погрешности с double

1)
const uint SIZE = 3; // wtf
const int SIZE = 3; // work

2)
Когда в качестве счетчика цикла используется тип double при подсчете возникают погрешности
for (double i = 0.2; i <= 4.8; i = i + 0.2)
Цикл доходит только до 4.6 потому что при дебаге там обнаруживается 4.60000001 или же в середине работы наблюдаются 3.29999999 и т. п.
1)
http://ideone.com/XALov4
компилируется без проблем

2)
используете целочисленный счетчик. такие циклы лучше оптимизируются
в крайнем случае делайте сравнение с погрешностью: Math.Abs(i - 4.8) < 0.0001

дело в том, что числа с плавающей запятой хранятся в памяти в виде двоичной дроби (а не десятичной) , поэтому число округляется до ближайшей дроби, в знаменателе которой стоит степень двойки.
например, число 0.5 без проблем запишется в виде дроби 1/2
а вот число 4.8 нельзя представить в виде несократимой дроби, где числителем будет целое число, а знаменателем - степень двойки
приближения могут быть например такими:
1229/2^8= 4.80078125
314573/2^16 = 4.8000030517578125
20615843021/2^32 = 4.80000000004656612873077392578125
и т. д. , в зависимости от точности.
Игорь Курило
Игорь Курило
7 027
Лучший ответ
using System;
namespace example {
    class Program {
        static void Main(string[] args) {
            Random rand = new Random();
            const uint size = 10;
            Int32[] vector = new int[size];
            for (uint n = 0; n < size; ++n) vector[n] = rand.Next(1, 10);
            foreach (var v in vector) Console.Write(" " + v);
            Console.ReadLine();
        }
    }
}

using System;
namespace example {
    class Program {
        static void Main(string[] args) {
            double x = 4.8, dx = 0.2;
            for (double beg = dx; beg < x + dx / 2; beg += dx) Console.WriteLine("{0:F1}", beg);
            Console.ReadLine();
        }
    }
}
Кирилл Таран
Кирилл Таран
58 601

Похожие вопросы