Чтобы разъяснить происходящее, были сделаны следующие шаги. 1. Константы 3.1 и 0.8 переведены в машинное представление а затем назад в десятичное с максимальной для паскалевских данных вещественного типа real (он же double) точностью (вложения 1 и 2). 2. В системе компьютерной алгебры, позволяющей работать с произвольной точностью (выбрана точность в 30 значащих цифр) для полученных констант выполнены соответствующие заданному фрагменту программы вычисления (вложение 3) 3. Результат 0.499999999999999955591079014996 был переведен в машинное представление. Затем в машинное представление была переведена константа 0.5, которая, как видно во вложении 4, представляется в компьютере точно. Поэтому проверка на точное равенство с 0.5 дает не тот результат, который Вы ожидали. 4. Можно было также воспользоваться программой на паскале. begin var x:=3.1; var y:=0.8; var p:=2; var a:=Frac(x); // =0,1 var b:=Frac(y)-0.5; // =0,3 var kp:=sqrt(sqr(0.5-a)+b*b); // =0,5 if abs(kp-0 Writeln(kp-0.5) end.
Результат: -5.55111512312578E-17 Это как раз то, что так портит Вам всю картину.
По поводу Вашего условия if kp>=0.5 then p=p+1; Ошибка имеет порядок 0.6·10⁻¹⁶ и наверно ничего страшного не будет, если оператор (с запасом) подправить на if kp>=(0.5-1e-15) then p:=p+1;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace zamenaZnakaVmassive { class Program { static void Main(string[] args) { int[] mas = new int[10]; Random r = new Random(); Console.WriteLine("Исходный массив: "); for (int i = 0; i<mas.Length;i++) { mas[i] = r.Next(1, 10); Console.Write(mas[i] + " "); } Console.WriteLine(); Console.WriteLine("Введите значение"); int x = int.Parse(Console.ReadLine()); Console.WriteLine("Измененный массив: "); for (int i =0; i < mas.Length; i++) { if (mas[i] == x) mas[i] = mas[i] * (-1); Console.Write(mas[i] + " "); } Console.ReadKey(); { } } } }