+double dicotomi(double init, void *diff(double, void*), void *var_cnst){
+ double min, max;
+ double overall_error;
+
+ min = max = init;
+ overall_error = 1;
+
+ while(overall_error > epsilon_min_error){
+ if( diff(min, var_cnst) > 0 && diff(max, var_cnst) > 0 ){
+ if(min == max){
+ min = min / 2.0;
+ }else{
+ max = min;
+ }
+ }else if( diff(min, var_cnst) < 0 && diff(max, var_cnst) < 0 ){
+ if(min == max){
+ max = max * 2.0;
+ }else{
+ min = max;
+ }
+ }else if( diff(min, var_cnst) < 0 && diff(max, var_cnst) > 0 ){
+ middle = (max + min)/2.0;
+
+ if( diff(middle, var_cnst) < 0 ){
+ min = middle;
+ }else if( diff(middle, var_cnst) > 0 ){
+ max = middle;
+ }else{
+ WARN0("Found an optimal solution with 0 error!");
+ overall_error = 0;
+ }
+ overall_error = fabs(min - max);
+ }else{
+ WARN0("The impossible happened, partial_diff(min) >0 && partial_diff(max) < 0");
+ }
+ }
+}