2010-02-02 5 views
2

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

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


UPDATE:

Для моей цели, я хотел бы, чтобы вычислить вес, как обратная дистанцию ​​на что-то вроде обратной расстояния весовой интерполяции (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 dist [i] равен 0, я бы хотел, чтобы его соответствующие значения значения [i] были доминирующими. Если есть несколько расстояний 0, я хотел бы, чтобы их значения вносили равный вклад в результат. Любая идея, как его реализовать?

+1

Вы действительно хотите использовать самый большой номер двойной точности для веса? Там могут быть проблемы, особенно если расстояние равно 0 для более чем одного значения i. Максимальное значение двойника составляет около 10^308. Возможно, было бы лучше установить wgt_tmp на что-то вроде 10^150 при расстоянии == 0, которое (пока другие веса намного меньше этого) будет иметь эффект взятия невзвешенного значения по всем значениям, где расстояние == 0 , когда такие значения существуют, или взвешенное среднее по всем значениям, когда все расстояния отличны от нуля. –

+0

Спасибо Крису. Это хорошие предложения. когда расстояние, хранящееся в двойном типе, не равно 0, но очень малое, будет принимать обратное превышение максимального значения, которое может представлять двойник? Если да, то как вы проверяете, достаточно ли расстояния для ограничения его взаимности? – Tim

ответ

2

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

3

Просто ищете numeric limits информацию?

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

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

+0

Спасибо, мои вопросы больше, чем это. – Tim

+0

Хорошо. Когда я отправил этот ответ, это было все, о чем вы просили ... – 2010-02-02 17:38:07

3

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

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

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

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

См numeric_limits

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

+0

Спасибо, можете ли вы попытаться ответить на мои другие вопросы, пожалуйста? – Tim