Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2016, 21:15   #1
Alexandr-
Пользователь
 
Регистрация: 04.03.2013
Сообщений: 79
По умолчанию Расчет суммы. Точность вычисления с типом данных double

Здравствуйте, объясните пожалуйста почему при расчете суммы в зависимости от порядка сложения получаются разные результаты?

Код:
namespace summa
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        double s1 = 0;
        double s2 = 0;
 
        private void Form1_Load(object sender, EventArgs e)
        {
            for (double i = 1; i <= 1000000; i++)
            {
                s1 += 1 / (i * i);   
            }
            for (double i = 1000000; i >= 1; i--)
            {
                s2 += 1 / (i * i);
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            label1.Text = "S1= " + s1;
            label2.Text = "S2= " + s2;
        }
 
        
    }
}
S1= 1.64493306684877
S2= 1.64493306684873
Alexandr- вне форума Ответить с цитированием
Старый 29.09.2016, 21:50   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Потому что в компьютере числа имеет ограниченную длину. Для примера Single.
1.0
Прибавляем
1E-8
Для этого денормируем числа.
1.0000000
0.00000001
Затем складываем
1.0000000
+
0.00000001
========
1.00000001
Для записи результата число округляется до размеров Single.
1.0000000

Для Double аналогично просто мне 16 нулей лень писать.
Так что запоминаем правило, от перестановки слагаемых сумма меняется.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 29.09.2016, 21:57   #3
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

Да, это от округления.
PS. В Си выражение 1+1/1000000 конечно не прокатит, там сразу " округлит ", надо 1+1.0/1000000 Но, не в этом суть.
Изображения
Тип файла: png окр.PNG (12.1 Кб, 21 просмотров)

Последний раз редактировалось type_Oleg; 29.09.2016 в 22:03.
type_Oleg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP, тип Double - точность вычислений vinniepooh PHP 25 13.01.2016 20:32
Расчет контрольной суммы Demagog Общие вопросы Delphi 0 24.03.2013 18:49
Точность double в c++ firephenix Помощь студентам 0 25.10.2011 12:35
Точность вычисления Von Общие вопросы C/C++ 2 25.01.2011 17:45
Long double. Максимальная точность. juzam Общие вопросы C/C++ 2 05.10.2010 14:48