Точность math.pow, numpy.power, numpy.float_power, pow и ** в python

#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