машинная точность

Интересно, есть ли что-то вроде eps для представления значения машинной точности в C++? Могу ли я использовать его как наименьшее положительное число, которое может представлять двойное число? Можно ли использовать 1.0/eps как максимальное положительное число, которое может представлять двойное число? Где я могу найти eps в стандартных библиотеках C++ и C?

Спасибо и привет!


ОБНОВИТЬ:

Для моей цели я хотел бы вычислить вес как обратную величину расстояния для чего-то вроде интерполяции взвешивания с обратным расстоянием (http://en.wikipedia.org/wiki/Inverse_distance_weighting).

double wgt = 0, wgt_tmp, result = 0;
for (int i = 0; i < num; i++)
{
   wgt_tmp = 1.0/dist[i];
   wgt += wgt_tmp;
   result += wgt_tmp * values[i];
}
results /= wgt;

Однако расстояние может быть равно 0, и мне нужно сделать вес пригодным для вычисления. Если есть только одно расстояние, dist[i] равно 0, я хотел бы, чтобы его соответствующие значения values[i] были доминирующими. Если есть несколько расстояний, равных 0, я хотел бы, чтобы их значения в равной степени влияли на результат. Любая идея, как это реализовать?


person Tim    schedule 02.02.2010    source источник
comment
Хотели бы вы на самом деле использовать наибольшее число с двойной точностью для веса? Могут возникнуть проблемы, особенно если расстояние равно 0 для более чем одного значения i. Максимальное значение двойного числа составляет около 10 ^ 308. Возможно, было бы лучше установить для wgt_tmp что-то вроде 10 ^ 150, когда расстояние == 0, что (пока другие веса намного меньше этого) будет иметь эффект получения невзвешенного среднего по всем значениям, где расстояние == 0 , когда такие значения существуют, или взвешенное среднее по всем значениям, когда все расстояния не равны нулю.   -  person Chris Johnson    schedule 02.02.2010
comment
Спасибо, Крис. Это хорошие предложения. когда расстояние, хранящееся в двойном типе, не равно 0, а очень мало, будет ли его обратное значение превышать максимальное значение, которое может представлять двойное число? Если да, то как проверить, достаточно ли мало расстояние для ограничения его обратной величины?   -  person Tim    schedule 02.02.2010


Ответы (3)


Это полностью зависит от точности, которую вы хотите получить от своих чисел, максимальное значение в двойном значении очень велико, но страдает от огромных ошибок округления. Например, если вам нужна точность 1e-3, вам нужно как минимум 10 бит после числа с плавающей запятой, то есть у вас не должно быть показателя степени больше, чем количество битов в мантиссе минус 10, в случае двойного числа, то есть 52 - 10 = 42, что дает вам максимум примерно 4e12 и соответствующий минимум примерно 2,5e-13.

person wich    schedule 02.02.2010

Используя #include <limits> у вас есть

Маленькое положительное значение = std::numeric_limits<float>::denorm_min()

Наибольшее положительное значение = std::numeric_limits<float>::max()

Очевидно, это относится и к другим типам.

См. numeric_limits.

И нет, инверсия наименьшего положительного значения не равна наибольшему.

person Peter Alexander    schedule 02.02.2010
comment
Спасибо, не могли бы вы попытаться ответить на другие мои вопросы, пожалуйста? - person Tim; 02.02.2010

Просто ищете информацию об числовых ограничениях?

Ссылка показывает, как найти эпсилон, денормализованный минимум и т. д., используя стандартную библиотеку C++. Для них нет эквивалента в стандартной библиотеке C. Вам нужно будет вычислить их самостоятельно (статья Википедии о «машинном эпсилоне» дает пример)...

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

person Community    schedule 02.02.2010
comment
Спасибо, у меня больше вопросов. - person Tim; 02.02.2010