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 и т. п.
Другие языки программирования и технологии
C# Почему const uint SIZE не воспринимается массивом, как константа, а int работает? Погрешности с double
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
и т. д. , в зависимости от точности.
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
и т. д. , в зависимости от точности.
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();
}
}
}
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();
}
}
}
Похожие вопросы
- В двух массивах строковых констант хранятся слова:существительные и глаголы. Составте программу, которая выводит:
- C# почему когда создаю тип данных byte - он его автоматически преобразовывает в тип int?
- C почему у меня массив на 4 символа, а я ввожу 10 например, и он потом выводит 10 из этого массива, вот мой код:
- Вес может ли быть дробным числом? Какой тип данных использовать для этого int или float или double ?
- Мой учитель очень расстроился, когда я ему сказал что перешел на C#. Почему?
- C++, почему не выводится на экран текст: Введенное Вами число - простое.
- в чем основная сложность C++ ,почему его многие боятся учить?
- [C++] Почему не рекомендуют использовать глобальные переменные?
- Почему Андроиды лагают со временем (через год-пол года). А яблоко работает без единого лага. Не знаю покупать андроид или
- Почему мы ничего не зная о компьютере можем его программировать и работать с ним?