LINUX.ORG.RU
Ответ на: комментарий от dilmah

>умножать -- это не складывать.

Мало того что операции разные. Так при умножении ещё и точность быстрее теряется.

А вообще, результат очень зависит от конкретных цифр. Проще проверить, чем строить сомнительные теории )

melkor217 ★★★★★
()

дробные числа распределены неравномерно - чем дальше от нуля тем больше машинный эпсилон, т.е. шаг между двумя соседними значениями. на лабах считали погрешность - получалась точность машинных чисел что-то вроде 10^-17 в среднем. при умножении абсолютная погрешность : D(X*Y)=X*D(Y)+Y*D(X) (D-абсолютная погрешность). или d(X*Y)=d(X)+d(Y) (d- относительная погрешность = D(X)/X ) оцени погрешность на каждом шаге по рекурентной формуле (берешь за одну из переменных результат пред.цикла за вторую - новые данные).

iero
()

Если не ошбаюсь вроде так:

Имеем числа 403322.2 232.4

Берем длину второго(так как самое маленькое) добавляем один знак и усекаем остальные до этой длины. перемножаем 403320*232.4. Вычисляем находим разницу (403322.2*232.4)-403320*232.4. Затем вроде надо найти какое то отношение, то погрешность входных данных, в данном случае 0.1, к это разницы. То ли это разницы к первому результату. Результат и будет нашей погрешностью.

Нас чему то такому учили на выч. математике, но еще нас там учили, что грош цена таким подсчетам если результат операции не поместится в разрядной сетке.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Хотя погрешностью входных данных лучше считать эпсилон машинное. Я просто вспоминать начинаю. Точно там была погрешность входных данных. то есть E/

теперь я начал сомневаться что внизу, разность или таки полученное нами число (второе).

Dudraug ★★★★★
()
Ответ на: комментарий от KRoN73

Да, тоже верно, мы так погрешности почти везде и считали. Но на вычислительной математике нас достаточно хитро учили, но это было полтора года назад...

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

>Но на вычислительной математике нас достаточно хитро учили

Сложение относительных погрешностей - это общее правило.

Остальное - упрощения для частных случаев. Типа, если есть только число, то считается, что все цифры кроме последней - надёжные, последняя - нет. Тогда в произведении число надёжных цифр равно минимальному из числа надёжных цифр множителей + пишется ещё одна, ненадёжная цифра.

Экспериментальные физики поступают ещё веселее. Скажем, если у тебя ненадёжная цифра 1 или 2, то её оставляют. 3 и более - отбрасывают :) Правда, там уже ненадёжная цифра не та, которая последняя, а та, которую перекрывает погрешность (ибо погрешностями там оперируют уже явными, начиная с получения экспериментальных данных).

KRoN73 ★★★★★
()
Ответ на: комментарий от Dudraug

А вообще вроде так, считаем число как я написал выше. Находим разницу. Потом Eps*кол-во операций, и сравниваем разницу этим произведением больше и будет абсолютной погрешностью. Вроде что то типо того.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Вроде весь такой расчет делается из предположения что старший дробный разряд ненадежен в любом из данных чисел. То есть 2.00014 Погрешность 0.0001, а у 2.13 уже 0.1.

Dudraug ★★★★★
()
Ответ на: комментарий от KRoN73

>Экспериментальные физики поступают ещё веселее. Скажем, если у тебя ненадёжная цифра 1 или 2, то её оставляют. 3 и более - отбрасывают :) Правда, там уже ненадёжная цифра не та, которая последняя, а та, которую перекрывает погрешность (ибо погрешностями там оперируют уже явными, начиная с получения экспериментальных данных).

Забавно.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Вопрос ради интереса, так как погрешности в моей программе были только в курсе метрологии. А как при подсчете погрешности учитывается неточность вычислений? В смысле что если считать по приведенной вами формуле, то 4000 раз дадут свою неточность.

mky ★★★★★
()

Вырази исходные числа в натуральных дробях, перемножь дроби, приведи к double. Так меньше погрешности накопится.

mv ★★★★★
()
Ответ на: комментарий от mv

>Вырази исходные числа в натуральных дробях, перемножь дроби, приведи к double. Так меньше погрешности накопится.

+1 !!!

record ★★★★★
()
Ответ на: комментарий от mky

>А как при подсчете погрешности учитывается неточность вычислений? В смысле что если считать по приведенной вами формуле, то 4000 раз дадут свою неточность.

Я уже всего не помню, вроде было что-то про погрешность вычислений. Но если рассудить логически, то мы считаем что все дробные числа неточны, в компьютеры они не точны тем более. Умножение маленького числа на большое дает неточность, для этого мы производим сокращение чисел, иногда вообще усечение дробной части.

Но это больше математический метод, т.е. неточность самого вычисления чисел, которые не точны. 4000*Eps по идее неточность вычисления уже аппаратная.

Вот тут я сам засомневался: надо выбирать или большее или все же складывать.

По идее складывать. Потому что погрешность накапливается как от вычислений, так и от самого метода.

ИМХО, как-то так, ибо вычислительная математика предмет сложны.

PS: Я честно всего не помню, но там я научился главному. При использование некоторых мат. методов (Например найти корни уравнения) надо учитывать погрешность метода, как самого метода, так и в зависимости от функции с которой он работает и погрешность входных данных и вычислений. Поэтому если я столкнусь с такой задачей, я полезу в гугл и начну искать наиболее подходящие методы.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

> При умножение погрешности складываются, при сложение выбирается большее.

не совсем складываются. Если ты блуждаешь N шагов в случайную сторону то ты в среднем уйдешь только на sqrt(N).

ну и все-таки умножение это естественная операция для плавающей точки, т.е. погрешность дана богом и сложно с ней что-то сделать. А со сложением уже хитрее, порядок сложений может сильно влиять.

dilmah ★★★★★
()
Ответ на: комментарий от record

>Вырази исходные числа в натуральных дробях, перемножь дроби, приведи к double. Так меньше погрешности накопится.
Там порядки минус очень много...

А про то, что при умножении маленького и большого числа большая погрешность, ИМХО глупость, ибо перемножаются мантиссы, а порядки складываются.

Было решено сузить исследования, и перемножаются теперь 200 чисел, потому что дальше у меня идёт переполнение порядка...

Взял два произвольных числа с 15 значащими цифрами, перемножил, получил относительную погрешность, которую умножил на 200 и получил всего 2*10^-11.

Как всё хорошо закончилось, я уж думал каша получится в мантиссе, каждый день узнаёшь что-нибудь новенькое :)

borodun
() автор топика
Ответ на: комментарий от borodun

>Как всё хорошо закончилось,

Фигня получается. Младший "достоверный" бит мантиссы таки должен становится недостоверным. И после 52го умножения ничего вообще не должно оставаться. Но эксперименты с bc показывают, что остаётся. Может они его "рандомизируют" как-то, т.ч. погрешности "знакопеременны" и друг друга компенсируют? Или просто с числами везёт, и можно построить последовательность с накапливаюшейся погрешостью?

DonkeyHot ★★★★★
()

Возьми логарифм от каждого числа, найди сумму этих логарифмов, после чего вычисли экспоненту от суммы. Точность будет выше :)

white_pony
()
Ответ на: комментарий от Dudraug

> Но если рассудить логически, то мы считаем что все дробные числа неточны, в компьютеры они не точны тем более.

Наркоман? Число 5/7 - абсолютно точное число. А если не "по деревенски" - рациональное.

"в компьютере" оно не выразимо по основанию 2, поэтому довольствуемся приближением.

LamerOk ★★★★★
()

Признаться, мне лень читать весь тред выше, ну да это ясно дело, Ъ на ЛОРе не грех.

Итак, спрашиваешь, какова может быть погрешность?

Допустим, числа у тебя конечные, нормализованные (обычно так и бывает). Допустим, все промежуточные значения и результат тоже будут полноценные (конечные, нормализованные). Допустим также, что числа не подобраны так, чтобы результат был всегда каким-то круглым (типа 4*0.5*0.5*0.125*2....) или как-то специально попадал в какие-то особенные позиции (типа чуть больше 2^n или чуть меньше 2^n). Это тоже разумное допущение. Допустим, мантиссы входных чисел тоже распределены равномерно.

Тогда можно с уверенностью сказать, что результирующая погрешность будет распределена по гауссу. Нормальное распределение, знаешь такое? Оно описывается "сигмой".

Складываться у тебя будут квадраты этих сигм (т.е. дисперсии). Только не абсолютных погрешностей, а относительных.

То есть твои числа имеют какую-то разрядность (64 для double и 80 для x86 long double). Тебе нужно выяснить, сколько их них - мантисса (у double - 52 бита, у long double нагугли). То есть без знака и без экспоненты. Отсюда находишь относительную погрешность одной операции умножения. Далее умножаешь её на корень из 4560 и сразу получаешь относительную погрешность (сигму) результата.

А с какой точностью нужно вычислить сигму одного числа, считай самостоятельно, исходя из необходимой точности результата. Думаю, по порядку величины это будет где-то 2^-52*sqrt(4560)/4/sqrt(2) ~ 1.5e-16. Это среднее относительное отклонение полученного результата от точного. Чтобы наверняка, домножь это на 3 (есть даже такое выражение - три сигмы). Итого 5e-16. Но это довольно грубые прикидки.

Если у тебя вход в double, а все вычисления в long double (часто на сях на x86 неявно так и получается), то не парься, у тебя промежуточные результаты будут гораздо точнее, чем погрешности входных данных. И так же применима всё та же грубая оценка погрешности (см. выше), только не уверен в коэффициентах типа двойки.

alexsaa
()
Ответ на: комментарий от LamerOk

>Наркоман? Число 5/7 - абсолютно точное число. А если не "по деревенски" - рациональное.

Я тебе говорю как по науке. 5/7 точное лишь в мат. анализе и теоретической математике, в прикладной же оно неточное. И вообще ты приводишь частный случай, общий случай у нас 0.x * N^p.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

> 5/7 точное лишь в мат. анализе и теоретической математике, в прикладной же оно неточное.

Давай чуть-чуть пофантазируем. По состоянию на вчерашний вечер, у тебя было 28 зубов. Этой ночью тебя поймали какие-то отморозки, и арматуриной вышибли тебе 20 зубов. Итак, за ночь ты лишился 5/7 своих зубов. В точности, и вполне прикладным образом. Ага?

Manhunt ★★★★★
()
Ответ на: комментарий от dilmah

> а шатающиеся и выщербленные зубы ты как считаешь?

Ну это оставшиеся восемь :D

Manhunt ★★★★★
()
Ответ на: комментарий от dilmah

Собственно, и среди исходных 28 могли быть шатающиеся, или, например, кариозные :)

Manhunt ★★★★★
()
Ответ на: комментарий от Dudraug

> Я тебе говорю как по науке.

Ты мне говоришь, как баба Клава. Она тоже лечит все простуды бутылкой самогона "по науке".

> 5/7 точное лишь в мат. анализе и теоретической математике, в прикладной же оно неточное.


В "прикладной" что? Математике?

И вообще, ты меня не подецки огорчаешь. Я то думал, мы сегодняшним вечером установим точность √2.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Это ты меня огорчаешь, я говорил про то, ты даже можешь найти это выше, что мы не доверяем входным данным, просто нам говорили принять это как данность. Ну я допускаю что это не всегда так, но мы же не знаем какие и откуда числа у ОПа. И не знаем помещаются ли они в разрядную сетку. А если мы им не доверяем, то откуда возьмется доверие к ответу, даже если мы скалдываем 1.2+1.0, то если числа недоверенные то и ответ будет с погрешностью. Алсо играет роль, или ты забыл это, разрядность. Даже если наша система счисления это позволяет - это может не позволить разрядная сетка.

То есть любой ответ, имеет погрешность зависимую от Eps_машинное, но при вычисление ОДНОЙ операции, ну допустим умножение, и ответе допустим 2.2 такой погрешностью можно пренебречь, точнее она в принципе лишена смысла. Хотя если даже в такой операции нас интересует разряд близкий к погрешности, то уже и такому ответу нельзя доверять и погрешность будет иметь еще какой смысл.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Так что помимо погрешности операции 5/7, как раз то о чем говорил ты (невозможность выразить по модулю два) мы имеем еще погрешность входных данных. Ну если рассматривать не твои конкретные числа, что бы обосрать собеседника, а считать что дробное число может быть абсолютно любым и мы не знаем о погрешности операции ничего. То поймешь, что любое дробное число в общем случае неточно. Или ты будешь все 4000 просматривать и анализировать вручную? Но погрешность можно оценить на том же компьютере. А если чисел будет миллион?

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Вот у тебя вихри враждебные бушют в голове. Ты перемешал пиво с чипсами. Давай отделять.

> Ну если рассматривать не твои конкретные числа, что бы обосрать собеседника, а считать что дробное число может быть абсолютно любым и мы не знаем о погрешности операции ничего.


Нет никакой операции. Дробное число - это число. Точно такое же число, как не дробное. И √2 - это тоже число. Абсолютно точное число. Равное √2.

> мы не доверяем входным данным, просто нам говорили принять это как данность.


Если "нам говорили", то это = "условие задачи". С какого бодуна ты им "не доверяешь"?

Ты смешал в одну кучу четыре разных вещи:
1) Достоверность входных данных
2) Погрешность операции
3) Представление числа по определенному основанию.
4) Точность числа.

"Обсираю" я тебя именно за последнее, поскольку такое фривольное обращение с математичской терминологией на лоре практически подсудно ))))
Ищи иные "интуитивные термины" для выражения разницы между действительными/вещественными и ирр-/рациональными числами, если уж поленился учить матчасть.

Что касается опа, то ему не мешало бы вкурить разницу между представлением числа и точностью операции, но добрый alexsaa уже ответил на его вопрос.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Я не путаю эти вещи ни сколько.

Но корень из двух это конкретное число. А в общем случае operation(X) где operation произвольная операция, а X произвольное число. То погрешность будет, точнее считается что она есть.

>Если "нам говорили", то это = "условие задачи". С какого бодуна ты им "не доверяешь"?

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

>И √2 - это тоже число. Абсолютно точное число. Равное √2.

operation(X) - Абсолютно точное число равное operation(X)

Это и ежу понятно, но опять же это в теоретической математике. В прикладной, мы обычно получаем конкретные числа в читаемом виде, а это скорее всего z.y, хотя заметь я говорю "скорее всего", а не "всегда". И в прикладной математике operation(X) уже неточно в ОБЩЕМ СЛУЧАЕ.

>Ты смешал в одну кучу четыре разных вещи:

Я их не путаю, просто при подсчете точности ответа, а ведь это нужно ОПу как я понял, нужно учитывать очень много факторов.

Dudraug ★★★★★
()
Ответ на: комментарий от LamerOk

>Что касается опа, то ему не мешало бы вкурить разницу между представлением числа и точностью операции, но добрый alexsaa уже ответил на его вопрос.

ОПу, как я понял нужена была погрешность результата, а она должна учитывать все факторы. Представление числа - это погрешность входных данных, значение погрешности операции зависит от погрешности данных над которыми она производится. Как бы очевидно, что над точными числами любая операция не имеет погрешности, но она опять же может получиться при округление результата.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

> Я не путаю эти вещи ни сколько.

Если б ты не путал, ты б не называл велосипед самолетом, а дробь - неточным числом.

> Как минимум они неточны уже потому, что хранятся в ячейке определенной длины.


Ну вот, а говорил, что не путаешь. Кто тебе сказал, что в ячейках не точные числа?

> опять же это в теоретической математике. В прикладной


Нет никакой "теоретической" и "прикладной" математик. Заканчивай изобретать собственные термины, не то закончишь общением с самим собой и лечащим психиатором в дурке.

LamerOk ★★★★★
()
Ответ на: комментарий от Dudraug

А если мы имеем числа 4 и 3. То они у нас уже будут 4.000... и 3.000... И оба имеют погрешность EPS_машинное, как погрешность входных данных. Вычисляем получаем 12 с погрешностью умножения двух чисел с погрешностью EPS_машинное у каждого, но в этом случае мы игнорируем эту погрешность, т.к. в ответе последнее ВЗЦ имеет порядок 10^0, а EPS_машинное имеет порядок значительно меньший. Но в общем случае все далеко не так.

Dudraug ★★★★★
()
Ответ на: комментарий от LamerOk

>Ну вот, а говорил, что не путаешь. Кто тебе сказал, что в ячейках не точные числа?

Ты мне скажи, откуда мы для общего числа, сферического в вакуме запись его в ячейку памяти не даст потери? допустим у нас число 0.1234567, а eps_машинное у нас 0.0001. То мы потеряем часть числа нэ? 0.1234567 и погрешность 0.0000001 будем иметь 0.1234567 +- 0.0000001. если погрешность 0.00000000000000001 очевидно что ответ будет уже точным.

Dudraug ★★★★★
()
Ответ на: комментарий от LamerOk

>Нет никакой "теоретической" и "прикладной" математик. Заканчивай изобретать собственные термины, не то закончишь общением с самим собой и лечащим психиатором в дурке.

ОХ ЩИ!!! Ты совсем наркоман? Если да скажи сразу.

http://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%82%D0%B5%D0%BC%D0%B0%D1%82%D0%B8...

"Традиционно математика делится на теоретическую, выполняющую углублённый анализ внутриматематических структур, и прикладную"

http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%BD...

http://ru.wikipedia.org/wiki/%D0%A7%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%BD%D1%8B...

Все я пойду к зачету готовится. Надоело.

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

>очевидно что ответ будет уже точным

Хотя он тоже будет условно точным

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

> откуда мы для общего числа, сферического в вакуме запись его в ячейку памяти не даст потери?

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

Пока ты не поймешь разницу между "для каждого" и "скорее всего" - не будет из тебя математика. И инженера тоже.

> "Традиционно математика делится на теоретическую, выполняющую углублённый анализ внутриматематических структур, и прикладную"


Читай, на что ссылки даешь:

> В вопросе о том, что является прикладной математикой, нельзя составить чёткую логическую классификацию.


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

> Все я пойду к зачету готовится.


И то дело.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

>Нет никакой гарантии, что его входные данные не легли в систему счисления по основанию 2 и требуемой размерности без потерь.

Как нет гарантии и обратного и поэтому мы рассматриваем худший случай.

>Читай, на что ссылки даешь:

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

>И то дело.

Все закрываю браузер! Интернет и универ вещи несовместимые.

Dudraug ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.