ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
18 июня
201639 Топик полностью
Ксения (14.07.2010 17:38 - 20:30, просмотров: 149) ответил leon_ на Тем более интересен алгоритм, который сможет просуммировать произвольный массив с максимальной точностью.
Вы не правы. Потеря точности происходит в том месте, когда происходит скложение или вычитание большого числа и маленького. Причем большое и малое относительно друг друга, а не по абсолютной величине. Происходит это потому, что в матиссе, занятой большим из чисел, не находится места для меньшего числа, из-за ограниченного числа знаков мантиссы. Например, если float выделяет для мантиссы 7 десятичных знаков, то прибавление единички к числу 100 000 000 его не увеличит, сколько раз не прибавляй. В вот 1e-22 совершенно нормально прибавится к 1e-20, поскольку хоть и числа малы, но относительно друг друга отличаются мало. Поэтому нет разницы в том, в каком порядке элементы массива мы складываем - четные, нечетные или какие-либо еще. Единственное, что может помочь, - складывать начиная с малых чисел, постепенно переходя к большим. Здесь "мелочевка" будет накапливаться правильно, и появится надежда, что ее накопиться достаточно, чтобы дотянуться хотя бы до младших разрядов мантиссы большого числа. Но чтобы это осуществить, придется сортировать массив, что обычно более трудоемко, чем сразу складывать в double-формате. Сделать много сумматоров для каждого из диапазонов - палиативный выход. Но тогда придется слишком много заводить таких сумматоров, под всю область float: от 1e-38 до 1e+38. По грубым прикидкам (38+38)/(7/2) потребуется 22 сумматора. Тогда уж проще завести все 256 сумматоров :), под каждый двоичный разряд показателя степени. Однако процедура получится монстрообразная, никак не для МК. А главное, польза от него будет только тогда, когда массив достаточно длинен, а таких массивов в МК обычно не бывает.