сходятся к нулю с помощью недостаточного - PullRequest
3 голосов
/ 15 июля 2010

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

Я использую определенный алгоритм из числовых рецептов, который сводится к нулю через занижение:

// all types are the same floating type
sum = 0
for (i in 0,N)
   sum += abs(V[i]);

мой вопрос, как это происходит? как сумма небольших положительных чисел с плавающей точкой сходится к нулю / нулю?

есть ли какое-то условие, когда 0 + f = 0 , f > 0?

Алгоритм, о котором идет речь, - Джейкоби, http://www.mpi -hd.mpg.de / astrophysik / HEA / internal / Numeric_Recipes / f11-1.pdf , стр. 460 Вполне возможно, я неправильно понимаю, как достигается конвергенция, если да, пожалуйста, поправьте меня.

спасибо

Ответы [ 3 ]

2 голосов
/ 16 июля 2010

Если V - это массив doubles, а sum - это float (или single), вы можете иметь значения> 0, но при добавлении к сумме вы получите 0, если они меньшечем наименьшее ненулевое денормализованное значение, представимое в float.

Откуда вы знаете, sum на самом деле ноль, а не просто действительно близко?Все ли биты установлены в ноль?

РЕДАКТИРОВАТЬ: после прочтения фактического приложения замечание о снижении до нуля, вероятно, относится к повторным поворотам вокруг различных осей для определения собственных значений и собственных векторов матрицы.В этом случае алгоритм работает только в том случае, если вы можете предположить, что повторяющиеся умножения очень малых чисел сжимают или понижают до нуля.Однако действительная сумма не будет занижена.

1 голос
/ 16 июля 2010

Какие типы вы используете? Если f - это число с плавающей точкой, а d1 и d2 - двойные числа, вы получите это.

double d1 = std::numeric_limits<double>::min();
double d2 = std::numeric_limits<double>::min();
float f = d1 + d2;
if (f == 0.0) std::cout << "yes";
else std::cout << "no";

Это дает "да".

0 голосов
/ 15 июля 2010

Я был бы очень удивлен, если бы это было возможно при использовании арифметики IEEE 754.Дело в том, что IEEE 754 утверждает, что промежуточные результаты являются бесконечно точными, а затем округляются до целевого типа данных.

Поэтому, если у вас есть sum + V[i], это значение всегда будет больше или равно sum.При округлении до следующего представимого числа будет получено либо sum, либо число больше sum.

Конечно, в исходном вопросе нет ничего, что препятствовало бы отрицательности sum в первую очередь.,В этом случае ответ будет тривиальным.

В арифметике IEEE 754 нет числа f, такого, что 0 + f = 0 и в то же время f > 0.

...