/[guile]/guile/guile-core/libguile/numbers.c
ViewVC logotype

Diff of /guile/guile-core/libguile/numbers.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.190 by dirk, Sun Jun 1 13:58:42 2003 UTC revision 1.191 by kryde, Wed Jun 4 16:09:38 2003 UTC
# Line 2798  scm_max (SCM x, SCM y) Line 2798  scm_max (SCM x, SCM y)
2798        return (sgn < 0) ? x : y;        return (sgn < 0) ? x : y;
2799      } else if (SCM_REALP (y)) {      } else if (SCM_REALP (y)) {
2800        double z = xx;        double z = xx;
2801        return (z <= SCM_REAL_VALUE (y)) ? y : scm_make_real (z);        /* if y==NaN then ">" is false and we return NaN */
2802          return (z > SCM_REAL_VALUE (y)) ? scm_make_real (z) : y;
2803      } else {      } else {
2804        SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARGn, s_max);        SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARGn, s_max);
2805      }      }
# Line 2812  scm_max (SCM x, SCM y) Line 2813  scm_max (SCM x, SCM y)
2813        scm_remember_upto_here_2 (x, y);        scm_remember_upto_here_2 (x, y);
2814        return (cmp > 0) ? x : y;        return (cmp > 0) ? x : y;
2815      } else if (SCM_REALP (y)) {      } else if (SCM_REALP (y)) {
2816        int cmp = xmpz_cmp_d (SCM_I_BIG_MPZ (x), SCM_REAL_VALUE (y));        double yy = SCM_REAL_VALUE (y);
2817          int cmp;
2818          if (xisnan (yy))
2819            return y;
2820          cmp = xmpz_cmp_d (SCM_I_BIG_MPZ (x), yy);
2821        scm_remember_upto_here_1 (x);        scm_remember_upto_here_1 (x);
2822        return (cmp > 0) ? x : y;        return (cmp > 0) ? x : y;
2823      } else {      } else {
# Line 2821  scm_max (SCM x, SCM y) Line 2826  scm_max (SCM x, SCM y)
2826    } else if (SCM_REALP (x)) {    } else if (SCM_REALP (x)) {
2827      if (SCM_INUMP (y)) {      if (SCM_INUMP (y)) {
2828        double z = SCM_INUM (y);        double z = SCM_INUM (y);
2829          /* if x==NaN then "<" is false and we return NaN */
2830        return (SCM_REAL_VALUE (x) < z) ? scm_make_real (z) : x;        return (SCM_REAL_VALUE (x) < z) ? scm_make_real (z) : x;
2831      } else if (SCM_BIGP (y)) {      } else if (SCM_BIGP (y)) {
2832        int cmp = xmpz_cmp_d (SCM_I_BIG_MPZ (y), SCM_REAL_VALUE (x));        double xx = SCM_REAL_VALUE (x);
2833          int cmp;
2834          if (xisnan (xx))
2835            return x;
2836          cmp = xmpz_cmp_d (SCM_I_BIG_MPZ (y), xx);
2837        scm_remember_upto_here_1 (y);        scm_remember_upto_here_1 (y);
2838        return (cmp < 0) ? x : y;        return (cmp < 0) ? x : y;
2839      } else if (SCM_REALP (y)) {      } else if (SCM_REALP (y)) {
2840        return (SCM_REAL_VALUE (x) < SCM_REAL_VALUE (y)) ? y : x;        /* if x==NaN then our explicit check means we return NaN
2841             if y==NaN then ">" is false and we return NaN
2842             calling isnan is unavoidable, since it's the only way to know
2843             which of x or y causes any compares to be false */
2844          double xx = SCM_REAL_VALUE (x);
2845          return (xisnan (xx) || xx > SCM_REAL_VALUE (y)) ? x : y;
2846      } else {      } else {
2847        SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARGn, s_max);        SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARGn, s_max);
2848      }      }
# Line 2864  scm_min (SCM x, SCM y) Line 2879  scm_min (SCM x, SCM y)
2879        return (sgn < 0) ? y : x;        return (sgn < 0) ? y : x;
2880      } else if (SCM_REALP (y)) {      } else if (SCM_REALP (y)) {
2881        double z = xx;        double z = xx;
2882          /* if y==NaN then "<" is false and we return NaN */
2883        return (z < SCM_REAL_VALUE (y)) ? scm_make_real (z) : y;        return (z < SCM_REAL_VALUE (y)) ? scm_make_real (z) : y;
2884      } else {      } else {
2885        SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARGn, s_min);        SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARGn, s_min);
# Line 2878  scm_min (SCM x, SCM y) Line 2894  scm_min (SCM x, SCM y)
2894        scm_remember_upto_here_2 (x, y);        scm_remember_upto_here_2 (x, y);
2895        return (cmp > 0) ? y : x;        return (cmp > 0) ? y : x;
2896      } else if (SCM_REALP (y)) {      } else if (SCM_REALP (y)) {
2897        int cmp = xmpz_cmp_d (SCM_I_BIG_MPZ (x), SCM_REAL_VALUE (y));        double yy = SCM_REAL_VALUE (y);
2898          int cmp;
2899          if (xisnan (yy))
2900            return y;
2901          cmp = xmpz_cmp_d (SCM_I_BIG_MPZ (x), yy);
2902        scm_remember_upto_here_1 (x);        scm_remember_upto_here_1 (x);
2903        return (cmp > 0) ? y : x;        return (cmp > 0) ? y : x;
2904      } else {      } else {
# Line 2887  scm_min (SCM x, SCM y) Line 2907  scm_min (SCM x, SCM y)
2907    } else if (SCM_REALP (x)) {    } else if (SCM_REALP (x)) {
2908      if (SCM_INUMP (y)) {      if (SCM_INUMP (y)) {
2909        double z = SCM_INUM (y);        double z = SCM_INUM (y);
2910        return (SCM_REAL_VALUE (x) <= z) ? x : scm_make_real (z);        /* if x==NaN then "<" is false and we return NaN */
2911          return (z < SCM_REAL_VALUE (x)) ? scm_make_real (z) : x;
2912      } else if (SCM_BIGP (y)) {      } else if (SCM_BIGP (y)) {
2913        int cmp = xmpz_cmp_d (SCM_I_BIG_MPZ (y), SCM_REAL_VALUE (x));        double xx = SCM_REAL_VALUE (x);
2914          int cmp;
2915          if (xisnan (xx))
2916            return x;
2917          cmp = xmpz_cmp_d (SCM_I_BIG_MPZ (y), xx);
2918        scm_remember_upto_here_1 (y);        scm_remember_upto_here_1 (y);
2919        return (cmp < 0) ? y : x;        return (cmp < 0) ? y : x;
2920      } else if (SCM_REALP (y)) {      } else if (SCM_REALP (y)) {
2921        return (SCM_REAL_VALUE (x) < SCM_REAL_VALUE (y)) ? x : y;        /* if x==NaN then our explicit check means we return NaN
2922             if y==NaN then "<" is false and we return NaN
2923             calling isnan is unavoidable, since it's the only way to know
2924             which of x or y causes any compares to be false */
2925          double xx = SCM_REAL_VALUE (x);
2926          return (xisnan (xx) || xx < SCM_REAL_VALUE (y)) ? x : y;
2927      } else {      } else {
2928        SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARGn, s_min);        SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARGn, s_min);
2929      }      }

Legend:
Removed from v.1.190  
changed lines
  Added in v.1.191

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26