У меня также есть вопросы относительно правильной процедуры.Однако я считаю, что нужно сделать:
abs(x - y) <= 0.5 * eps * max(abs(x), abs(y))
вместо:
abs(x - y) < eps
Причина этого связана с определением эпсилона машины.Используя код Python:
import numpy as np
real = np.float64
eps = np.finfo(real).eps
## Let's get the machine epsilon
x, dx = real(1), real(1)
while x+dx != x: dx/= real(2) ;
print "eps = %e dx = %e eps*x/2 = %e" % (eps, dx, eps*x/real(2))
, который дает: eps = 2.220446e-16 dx = 1.110223e-16 eps*x/2 = 1.110223e-16
## Now for x=16
x, dx = real(16), real(1)
while x+dx != x: dx/= real(2) ;
print "eps = %e dx = %e eps*x/2 = %e" % (eps, dx, eps*x/real(2))
, который теперь дает: eps = 2.220446e-16 dx = 1.776357e-15 eps*x/2 = 1.776357e-15
## For x not equal to 2**n
x, dx = real(36), real(1)
while x+dx != x: dx/= real(2) ;
print "eps = %e dx = %e eps*x/2 = %e" % (eps, dx, eps*x/real(2))
, который возвращает: eps = 2.220446e-16 dx = 3.552714e-15 eps*x/2 = 3.996803e-15
Однако, несмотря на разницу между dx и eps * x / 2, мы видим, что dx <= eps*x/2
, таким образом, он служит для проверки на равенство, проверки на допуски при проверке на сходимость в числовых процедурах и т. Д.
Это похоже на то, что есть в: www.ibiblio.org / pub / languages / fortran / ch1-8.html # 02 , однако, если кто-то знает о лучших процедурах или что-то здесьневерно, пожалуйста, скажите.