Я пишу числовой код, который должен делать обширные (и, возможно, быстрые) сравнения чисел с двойной точностью. Мое решение для сравнения двух чисел A и B включает смещение A влево (или вправо) на epsilon и проверку того, является ли результат больше (или меньше), чем B. Если это так, два двойника одинаковы. (Дополнительное кодирование необходимо выполнить для отрицательных или нулевых чисел).Простой способ сравнения дублей
Это сравнение функции:
#define S_
inline double s_l (double x){
if(x>0){return 0.999999999*x;}
else if(x<0){return 1.00000001*x;}
else {return x-0.000000000001;}
}
inline double s_r (double x){
if(x>0){return 1.00000001*x;}
else if(x<0){return 0.999999999*x;}
else{return x+0.000000000001;}
}
inline bool s_equal (double x,double y){
if(x==y){return true;}
else if(x<y && s_r(x)>y){return true;}
else if(x>y && s_l(x)<y){return true;}
else{return false;}
}
#endif
Поскольку это является частью MonteCarlo алгоритма и s_equal (х, у) называется миллионы раз, я задаюсь вопросом, есть ли лучше или быстрее способ кодирования это, понятно на простом уровне.
Я делаю что-то вроде abs ((x-y)/x) <1.0e-10 –
«Почти равный» является передовой техникой и не должен быть легко предпринят. Например, если 'a' почти равно' b' и 'b' почти равно' c', из этого не следует, что 'a' почти равно' c'. Это может привести к непредвиденным осложнениям. –
@brianbeuning Рассмотрите возможность публикации этого ответа. Это очень близкое соответствие с представленным алгоритмом, и, удалив все это, если-ветвление, оно должно быть намного быстрее, чем представлено. –