tag:blogger.com,1999:blog-6846929136376245264.post276356043752244494..comments2024-01-03T12:54:39.457+03:00Comments on Привычка не думать: О точных вычисленияхИлья Весеннийhttp://www.blogger.com/profile/12075968879288943233noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-6846929136376245264.post-64008315876829427592015-05-26T10:36:06.017+03:002015-05-26T10:36:06.017+03:00Ссылка по теме: http://habrahabr.ru/post/258483/Ссылка по теме: http://habrahabr.ru/post/258483/Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-9936999917763133042013-12-23T20:58:42.221+04:002013-12-23T20:58:42.221+04:00погрешность уже сразу во второй строчке 1,00000000...погрешность уже сразу во второй строчке 1,000000000000009Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-60314972410169875832013-09-16T15:44:15.731+04:002013-09-16T15:44:15.731+04:00Я больше скажу — погрешность есть уже в самой перв...Я больше скажу — погрешность есть уже в самой первой строчке. Как известно, машина считает в двоичной системе. А в ней конечной дробью могут быть записаны только рациональные числа со знаменателем, равным степени двойки. То есть 0,1 при переводе из десятичной системы в двоичную превратится в бесконечную дробь. А значит, в памяти компьютера будет находится не точно 0,1, а какое-то 0,1+eps (греч. «эпсилон» — традиционное обозначение малого числа в математике).<br />Отсюда нетрудно понять, почему погрешность быстро возрастает. Подставим 0,1+eps в нашу формулу:<br />1001*(0,1+eps)-100 = 100,1 + 1001*eps - 100 = 0,1 + 1001*eps,<br />то есть на каждом шаге погрешность увеличится примерно в тысячу раз (точно 1001 в раз, если бы дальнейшие вычисления были совершенно точными). Это и видно в результатах: через пять шагов ошибка около 9%, через шесть — почти в 90 раз (т.е. около 9000%), через семь — почти в 90000 раз (9 млн.проц.) и так с каждым шагом на три порядка. Это то, что в математике называется неустойчивостью. Формула воспроизводила бы 0,1 бесконечное число раз, только если бы начальное приближение было равно в точности 0,1 (а в двоичном представлении с конечным числом разрядов это невозможно) и все последующие вычисления также были бы совершенно точны. Но стоит появиться небольшой погрешности — она неограниченно возрастает и со временем всё собой заполняет.Дмитрийhttp://vk.com/dnfominnoreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-15639253474160790292013-02-26T16:47:33.003+04:002013-02-26T16:47:33.003+04:00Погрешность уже во второй строчке есть, просто её ...Погрешность уже во второй строчке есть, просто её вам не показывают (можно настроить, сколько знаков отображать).<br />Если б погрешности при переходе от первой ко второй строке не возникало, то не трудно понять, что её не возникло бы никогда.LisandreLhttps://www.blogger.com/profile/16538789902731952843noreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-28394491564532116032013-02-24T14:17:42.566+04:002013-02-24T14:17:42.566+04:00Погрешность есть уже в четвертой строчке - через т...Погрешность есть уже в четвертой строчке - через три шага:<br />1. 0,1<br />2. 0,1<br />3. 0,1<br />4. 0,1000000085<br />5. 0,1000085521<br />Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-73364424521200994682013-02-23T07:15:52.109+04:002013-02-23T07:15:52.109+04:00Результаты арифметических операций с плавающей точ...Результаты арифметических операций с плавающей точкой в Excel могут быть неточными<br />http://support.microsoft.com/kb/78113Алексей Дебрскийhttps://www.blogger.com/profile/06656061493092908712noreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-20787035978519771002013-02-23T00:57:59.308+04:002013-02-23T00:57:59.308+04:00О да. Недавно как раз столкнулась со связкой эксел...О да. Недавно как раз столкнулась со связкой эксель+бухгалтерия. Заказчики выгрузили список имущества для переоценки, 106 тысяч строк, разница между числами до 6 порядков. И, естественно, искренне не могли понять, почему от сортировки строк итоговая сумма меняется на несколько копеек. Вот просто в голову такое не может прийти, компьютер — он же точный!<br />К счастью, во всяких 1С используют тип с фиксированной запятой, там такого безобразия не будет.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-9028813592744292482013-02-22T17:22:10.220+04:002013-02-22T17:22:10.220+04:00Присвоить ячейкам тип "scientific" и вкл...Присвоить ячейкам тип "scientific" и включить соответствие внутренней точности отображаемой. Хотя эксель, конечно, пожалуется, что мы теряем точность.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-62685720585172711222013-02-22T16:28:44.918+04:002013-02-22T16:28:44.918+04:00Ничего странного, связано это с особенностю предст...Ничего странного, связано это с особенностю представления вещественных чисел в двоичном виде. Вкратце - конечная десятичная дробь запросто может оказаться, скажем, периодической в двоичном виде. То же 0.1:<br /><br />0.1(10) = 0.(00011)(2)<br /><br />Отсюда и неточность. Выход - использовать целые числа (т.е. считать деньги в копейках) или специальные типы данных.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-41517557341345019902013-02-22T14:19:40.419+04:002013-02-22T14:19:40.419+04:00Это, кстати, также довольно частая ошибка начинающ...Это, кстати, также довольно частая ошибка начинающих программистов. Еще возможны варианты, когда (условно) 0.123 ≠ 0.123 или 0.2 + 0.2 ≠ 0.4<br /><br />Неплохое разъяснение такого поведения можно найти, например, в этой статье: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=374Miwahttps://www.blogger.com/profile/09504214675289787660noreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-36878266767874748552013-02-22T14:03:16.059+04:002013-02-22T14:03:16.059+04:00попробуйте еще в соседней колонке, начиная с B2 вв...попробуйте еще в соседней колонке, начиная с B2 ввести =A2-A1 и продлите далее по всей колонке формулу.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-29013878407107197372013-02-22T13:54:38.382+04:002013-02-22T13:54:38.382+04:00Спасибо за формулировку правильного вопроса!Спасибо за формулировку правильного вопроса!Илья Весеннийhttps://www.blogger.com/profile/12075968879288943233noreply@blogger.comtag:blogger.com,1999:blog-6846929136376245264.post-46338047368787000622013-02-22T13:40:59.186+04:002013-02-22T13:40:59.186+04:00К слову в LibreOffice Calc и таблицах Google Docs ...К слову в LibreOffice Calc и таблицах Google Docs результат аналогичный.<br />Для желающих ещё раз проверить свою интуицию:<br />Изменится ли что-то, если вместо 0.1 и 1001*An-100 взять 0.125 и 1001*An-125? Почему?LisandreLhttps://www.blogger.com/profile/16538789902731952843noreply@blogger.com