2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


В этом разделе нельзя создавать новые темы.

Если Вы хотите задать новый вопрос, то не дописывайте его в существующую тему, а создайте новую в корневом разделе "Помогите решить/разобраться (М)".

Если Вы зададите новый вопрос в существующей теме, то в случае нарушения оформления или других правил форума Ваше сообщение и все ответы на него могут быть удалены без предупреждения.

Не ищите на этом форуме халяву, правила запрещают участникам публиковать готовые решения стандартных учебных задач. Автор вопроса обязан привести свои попытки решения и указать конкретные затруднения.

Обязательно просмотрите тему Правила данного раздела, иначе Ваша тема может быть удалена или перемещена в Карантин, а Вы так и не узнаете, почему.



Начать новую тему Ответить на тему
 
 Плавающая запятая. Помогите разобраться.
Сообщение08.02.2009, 21:53 


18/01/09
27
Пусть мы работаем с 6-значной арифметикой. Если в ходе решения получаем число 0.27 и нам нужно его использовать дальше, то мы рассматриваем его как 0.270000 или мы безвозвратно потеряли остальные 4 цифры и работаем в 2-значной арифметике?

 Профиль  
                  
 
 
Сообщение08.02.2009, 22:35 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Если в 6-значной получили 0.27, то это означает $0.270000\pm e; |e|\le 0.0000005$
то есть мы теряем только седьмую цифру(ну и следующие)

 Профиль  
                  
 
 
Сообщение08.02.2009, 22:44 


18/01/09
27
То есть, если мы из 1111.38 вычитаем 1111.11, то результатом считаем 0.270000 :?: :?:
Но это же нечестно! Мы ведь не знаем, что там дальше на самом деле!!! :?

 Профиль  
                  
 
 
Сообщение08.02.2009, 23:05 
Заслуженный участник
Аватара пользователя


13/08/08
14495
да, Вы правы. Поэтому при сложении на компьютере массива чисел надо сначала складывать наименьшие, иначе мы их потеряем. И при вычитании больших близких чисел теряются знаки. Поэтому важно знать, как было получено это число.

 Профиль  
                  
 
 
Сообщение08.02.2009, 23:16 


18/01/09
27
Верно, но меня интересует скорее теоретическая сторона вопроса, нежели практическая.
Важно - переходим ли мы к двухзначной арифметике!! Просто, если нам затем надо прибавить, к примеру, 0.127456, то мы округляем 0.127456 до 0.13 и считаем 0.27+0.13=0.40 или 0.270000+0.127456=0,397456? Если первое, то это расточительно, но корректно, если второе - то, видимо некорректно, да???

 Профиль  
                  
 
 
Сообщение09.02.2009, 00:55 
Заслуженный участник
Аватара пользователя


13/08/08
14495
надо следить за порядками. если в той же двоичной сложить двадцать единиц, а потом прибавить 120, то получим 140.
А если к 120 прибавить хоть сто единиц по очереди, то получим те же 120.
Это описывается в теории абсолютных и относительных погрешностей

 Профиль  
                  
 
 
Сообщение09.02.2009, 02:49 
Аватара пользователя


31/10/08
1244
Mathdream
Возьми и почитай как устроенны числа с плавующей точкой.
0.270000+0.127456=0,397456 - это корректно

 Профиль  
                  
 
 
Сообщение09.02.2009, 09:19 
Экс-модератор


17/06/06
5004
gris в сообщении #184950 писал(а):
Поэтому при сложении на компьютере массива чисел надо сначала складывать наименьшие, иначе мы их потеряем.
Давайте поясню, что-ли. Есть такая классическая задачка по программированию - вычислить сумму $\sum\limits_{n=1}^{10000000}\frac1{n^2}$ и сравнить с точным значением суммы до бесконечности (это $\frac{\pi^2}6$). Ну все начинают суммировать:
Код:
float n, s=0;
for (n=1; n<=10000000; ++n)
    s+=1./(n*n);
и получается ужасно неправильно. Потом им объясняют, что складывать надо в обратном порядке:
Код:
float n, s=0;
for (n=10000000; n>=1; --n)
    s+=1./(n*n);
, и тут же всё получается правильно. Проблема - именно та, которую мы тут обсуждаем. У меня на этих примерах разница в 4-м знаке набегает: 1.644725 vs 1.644934

 Профиль  
                  
 
 
Сообщение09.02.2009, 10:21 
Аватара пользователя


18/10/08
454
Омск
Mathdream писал(а):
То есть, если мы из 1111.39 вычитаем 1111.11, то результатом считаем 0.270000 :?: :?:
Но это же нечестно! Мы ведь не знаем, что там дальше на самом деле!!! :?


Как известно, погрешности при сложении складываются:
$(x + \Delta x) + (y + \Delta y) = (x + y) + (\Delta x + \Delta y)$,
при вычитании тоже складываются:
$(x + \Delta x) - (y + \Delta y) = (x - y) + (\Delta x + \Delta y)$,
Поэтому, так как мы вычитаем из $1111.39 \pm 0{.}01$ число $1111{.}11 \pm 0{.}01$, то получаем:
$1111{.}39 \pm 0.01 - 1111{.}11 \pm 0{.}01 = 0.27 \pm 0{.}02$.

Далее, мы складываем $0.127456 \pm 0{.}000001$ и $0{.}27 \pm 0{.}02$:
$0.127456 \pm 0{.}000001 + 0{.}27 \pm 0{.}02 = 0{.}397426 \pm 0.020001$.

 Профиль  
                  
 
 
Сообщение09.02.2009, 11:11 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
Mathdream в сообщении #184937 писал(а):
Но это же нечестно!

Именно так. Вы вот это ощущение запомните, пожалуйста, навсегда - оно полезно. А то многие забывают и потом швыряются этими числами туда-сюда как попало, будто так и надо. А там засада. Как сказал классик, "...каждый раз теряем чуть-чуть песка и подбираем чуть-чуть грязи".

 Профиль  
                  
 
 
Сообщение09.02.2009, 11:15 
Заслуженный участник


11/05/08
32166
между тем вычитать друг из друга близкие числа приходится довольно часто, и ничего с этим не поделаешь. Надо просто считаться с последствиями.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group