2014 dxdy logo

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

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




 
 О точности вычислений
Сообщение16.02.2013, 12:21 
Здравствуйте все, кто читает это!

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

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 13:07 
Гарантировать можно только то, что всё, что выведено на дисплей, имеется в представлении числа. Т.е. если у дисплея 10 цифр мантиссы и 2 цифры порядка, то в вычислениях участвуют они все. В некоторых калькуляторах есть ещё парочка цифр мантиссы, не помещающихся на экран, но участвующих в вычислениях для повышения точности.
Но в общем случае следует понимать, например, что добавление к числу порядка 1e+12 10000 раз числа 1 не даст правильного ответа в для калькулятора с 10-ю цифрами мантиссы.
Вообще, вычисления на калькулятора практически имеют те же ограничения, как и вычисления с floating-point arithmetic на компьютере.
В качестве источника информации по этой теме могу предложить статью "What Every Computer Scientist Should Know About Floating-Point Arithmetic" - её легко найти в интернете.

 
 
 
 Posted automatically
Сообщение16.02.2013, 14:41 
Аватара пользователя
 i  Тема перемещена из форума «Математика (общие вопросы)» в форум «Помогите решить / разобраться (М)»
Перенёс в соответствующий раздел

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 16:42 
Аватара пользователя
shtutser в сообщении #684578 писал(а):
гарантируется ли что все знаки числа, выводимые на дисплей, верны

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

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 17:12 
Спасибо за ответы и подсказки. Я вот спрошу напрямую: если я ввел на микрокалькулятор или в компьютерную программу выражение (к примеру): $\frac{e^2+\cos(1.4)}{\sqrt[3]{\sin(\sqrt2)}}$ и получаю ответ 7.590102908269122 , то в этом ответе все цифры верные, т.е. ошибка по сравнению с точным значением приведенного выражения не превосходит $10^{-15}$?

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 17:20 
Аватара пользователя
shtutser в сообщении #684678 писал(а):
Спасибо за ответы и подсказки. Я вот спрошу напрямую: если я ввел на микрокалькулятор или в компьютерную программу выражение (к примеру): $\frac{e^2+\cos(1.4)}{\sqrt[3]{\sin(\sqrt2)}}$ и получаю ответ 7.590102908269122 , то в этом ответе все цифры верные, т.е. ошибка по сравнению с точным значением приведенного выражения не превосходит $10^{-15}$?
Нет, $\frac{e^2+\cos(1.4)}{\sqrt[3]{\sin(\sqrt2)}} > 7.5901029082691235$

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 17:23 
Аватара пользователя
Если компьютер (калькулятор) сам выдал ответ такой длины (формат выдачи не указывался), то большие шансы на то, что все цифры верные. Можно проконтролировать поведение калькулятора (узнать его повадки), проделав те же вычисления так, чтобы получить нужное количество правильных разрядов в ответе. Это можно сделать, например, в Maple, где можно указать количество правильных разрядов.

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 17:45 
Xaositect, скажите, а как узнать (и как Вы узнали), что $\frac{e^2+\cos(1.4)}{\sqrt[3]{\sin(\sqrt2)}} > 7.5901029082691235$ ?

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 17:45 
TOTAL в сообщении #684685 писал(а):
Если компьютер (калькулятор) сам выдал ответ такой длины (формат выдачи не указывался), то большие шансы на то, что все цифры верные.


Вот простая программа на C++, являющаяся контрпримером:
Код:
#include <iostream>
int main()
{
    float x=1.12345e+8,y=1.;
    std::cout << "x="<<x<<std::endl;
    for(int i=0;i<30000;++i)
        x+=y;
    std::cout << "x="<<x<<std::endl;
}

Формат выдачи, как видно, не указывался.
Вывод на консоли:
Цитата:
x=1.12345e+08
x=1.12345e+08


Если, однако, заменить float на double, то будет:
Цитата:
x=1.12345e+08
x=1.12375e+08

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 18:00 
Аватара пользователя
10110111 в сообщении #684697 писал(а):
Вот простая программа на C++, являющаяся контрпримером:

Мое предположение относилось к вычислению приведенного вопрошающим выражения.
В Вашем 4-байтовом "контрипримере" одно из слагаемых является нулем по сравнению с другим.

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 18:01 
shtutser, некоторые программы учитывают точность, некоторые не учитывают.

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

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 18:02 
Аватара пользователя
shtutser в сообщении #684696 писал(а):
Xaositect, скажите, а как узнать (и как Вы узнали), что $\frac{e^2+\cos(1.4)}{\sqrt[3]{\sin(\sqrt2)}} > 7.5901029082691235$ ?
Вычислил тут: http://www.wolframalpha.com/input/?i=%2 ... 2%29%29%29 . Могу еще проверить интервальной арифметикой на рациональных числах.

 
 
 
 Re: О точности вычислений
Сообщение16.02.2013, 23:26 
Музыкой навеяло задачку из Кнута (Искусство программирования, 1.2.2.11 в 3-м изд.):
Пусть $b=10$, $x \approx \log_{10} 2$. Сколько десятичных знаков $x$ нужно знать,
чтобы определить первые три десятичных знака в десятичном представлении $b^x$.

(Оффтоп)

ответ: бесконечно много

Так что точность (в смысле плюс-минус) - это одно, а количество верных цифр - другое.

 
 
 
 Re: О точности вычислений
Сообщение17.02.2013, 09:32 
Всем спасибо за разъяснения, а Xaositect за интересную ссылку!

Но все-таки еще раз для дурака... Беру программу (скажем Mathcad), прошу ее вычислить сложную комбинацию элементарных функций, получаю какое-то число. Прошу вывести 17 (максимальное число) знаков мантиссы - он выводит. Есть ли у разработчиков подобных программ какой-нибудь стандарт (правило), такое, что я сразу могу сказать, что в выданном ответе, например, все 17 цифр - верны, например, в строгом смысле, т.е. погрешность результата по сравнению с точным значением не превосходит половины единицы 17 разряда? Или это по каждой программе нужно смотреть, какие там алгоритмы, как идет вычисление и т.д.
Как я понял, в Maple можно попросить выводить только верные цифры.

 
 
 
 Re: О точности вычислений
Сообщение17.02.2013, 12:58 
http://www.cs.berkeley.edu/~wkahan/LOG10HAF.TXT (Уилльям Кэхэн — создатель стандарта IEEE 754).

 
 
 [ Сообщений: 15 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group