pow(x,y)
вычисляется как e^(y*log(x))
Обычно математические библиотеки вычисляют log(x)
с четверной точностью (что отнимает много времени), чтобы избежать потери точности при вычислении y*log(x)
, поскольку ошибки точности будут увеличиваться при вычислении e^(y*log(x))
.Теперь, на случай, если я захочу вычислить pow(x,y)
в следующих шагах.
double pow(double x,double y) {
return exp(y*log(x)); // Without any quad precision multiplication
}
Какова будет максимальная ошибка ULP этой функции.Я знаю, что стандарт IEEE-754 гласит, что любая операция с плавающей запятой должна иметь ошибку менее 0,5 ULP, т.е. 0.5*2^(-52)
.Так что, если моя операция y*log(x)
страдает от ошибки 0,5 ULP, как мне вычислить максимально возможную ошибку ULP для e^(y*log(x))
Согласна, что вычисление pow(x,y)
довольно сложно.Алгоритмы обычно вычисляют log(x)
с более высокой точностью, и умножение между y
и log(x)
не является простым.Поскольку ошибка ULP зависит от y*log(x)
, максимальная ошибка будет для наибольшего значения Y*log(x)
, для которого e^(y*log(x))
не является бесконечностью.Правильно?Как вычислить количество ULP для такого случая?Каково максимальное количество битов мантиссы в формате двойной точности, которое будет меняться от фактического значения в случае наибольшего значения y*log(x)
?
Обновлен вопрос.Спасибо за всю помощь!
Так что разница в 10 бит приведет к тому, сколько будет ошибка ULP?Я вычислил это как
ULP = (actual - computed)/ 2^(e-(p-1))
, где e - показатель фактического числа, p = 53 для двойной точности.Я читал, что я ULP = 2 ^ (e- (p-1)) Давайте предположим,
Actual = 1.79282279439444787915898270592 *10^308
Computed = 1.79282279439451553814547593293 * 10^308
error= actual - computed = 6.7659e+294
Сейчас
1 ULP = 2^(e- (p-1))
e = 1023 (exponent of the actual number - bias)
1 ULP = 2^(1023 - (53-1)) = 2^971
ULP error = error/ 1 ULP = 339
Это правильно?