#python #math #floating-accuracy
#python #математика #плавающая точность
Вопрос:
Есть ли разница в точности между math.pow, numpy.power, numpy.float_power, pow() и ** в python, между двумя числами с плавающей запятой x, y? Я предполагаю, что x очень близко к 1, а y велико.
Ответ №1:
Один из способов, с помощью которого вы потеряете точность во всех случаях, — это если вы вычисляете небольшое число (скажем, z), а затем вычисляете
p = pow( 1.0 z, y)
Проблема в том, что у двойников около 16 значащих цифр, поэтому, если z, скажем, 1e-8, при формировании 1.0 z вы потеряете половину этих цифр. Хуже того, если z меньше 1e-16, 1.0 z будет ровно 1.
Вы можете обойти это, используя numpy-функцию log1p. Это вычисляет лог его аргумента плюс один, фактически не добавляя 1 к его аргументу, поэтому не теряя точности.
Вы можете вычислить p выше как
p = exp( log1p(z)*y)
что устранит потерю точности из-за вычисления 1 z
Комментарии:
1. Спасибо! Это лучше, чем использовать числовую базу 2 вместо e-based? Я спрашиваю, потому что я думаю, что log2 более точен, чем log1p.
2. Я не думаю, что существует log21p (который вычислял бы log2 (1 p). Поэтому, вероятно, лучше всего использовать log1p