@@ -455,13 +455,8 @@ pub(crate) fn max(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
455
455
Ok ( Number :: Fixnum ( n2) )
456
456
}
457
457
}
458
- ( Number :: Integer ( n1) , Number :: Integer ( n2) ) => {
459
- if n1 > n2 {
460
- Ok ( Number :: Integer ( n1) )
461
- } else {
462
- Ok ( Number :: Integer ( n2) )
463
- }
464
- }
458
+ ( Number :: Integer ( n1) , Number :: Integer ( n2) ) => Ok ( Number :: Integer ( cmp:: max ( n1, n2) ) ) ,
459
+ ( Number :: Rational ( r1) , Number :: Rational ( r2) ) => Ok ( Number :: Rational ( cmp:: max ( r1, r2) ) ) ,
465
460
( n1, n2) => {
466
461
let stub_gen = || {
467
462
let max_atom = atom ! ( "max" ) ;
@@ -471,7 +466,15 @@ pub(crate) fn max(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
471
466
let f1 = try_numeric_result ! ( result_f( & n1) , stub_gen) ?;
472
467
let f2 = try_numeric_result ! ( result_f( & n2) , stub_gen) ?;
473
468
474
- Ok ( Number :: Float ( cmp:: max ( OrderedFloat ( f1) , OrderedFloat ( f2) ) ) )
469
+ match OrderedFloat ( f1) . cmp ( & OrderedFloat ( f2) ) {
470
+ cmp:: Ordering :: Less => Ok ( n2) ,
471
+ cmp:: Ordering :: Equal => {
472
+ // Note: n1 and n2 were compared as floats,
473
+ // so we return the second argument as a floating point value.
474
+ Ok ( Number :: Float ( OrderedFloat ( f2) ) )
475
+ }
476
+ cmp:: Ordering :: Greater => Ok ( n1) ,
477
+ }
475
478
}
476
479
}
477
480
}
@@ -499,13 +502,8 @@ pub(crate) fn min(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
499
502
Ok ( Number :: Fixnum ( n2) )
500
503
}
501
504
}
502
- ( Number :: Integer ( n1) , Number :: Integer ( n2) ) => {
503
- if n1 < n2 {
504
- Ok ( Number :: Integer ( n1) )
505
- } else {
506
- Ok ( Number :: Integer ( n2) )
507
- }
508
- }
505
+ ( Number :: Integer ( n1) , Number :: Integer ( n2) ) => Ok ( Number :: Integer ( cmp:: min ( n1, n2) ) ) ,
506
+ ( Number :: Rational ( r1) , Number :: Rational ( r2) ) => Ok ( Number :: Rational ( cmp:: min ( r1, r2) ) ) ,
509
507
( n1, n2) => {
510
508
let stub_gen = || {
511
509
let min_atom = atom ! ( "min" ) ;
@@ -515,7 +513,15 @@ pub(crate) fn min(n1: Number, n2: Number) -> Result<Number, MachineStubGen> {
515
513
let f1 = try_numeric_result ! ( result_f( & n1) , stub_gen) ?;
516
514
let f2 = try_numeric_result ! ( result_f( & n2) , stub_gen) ?;
517
515
518
- Ok ( Number :: Float ( cmp:: min ( OrderedFloat ( f1) , OrderedFloat ( f2) ) ) )
516
+ match OrderedFloat ( f1) . cmp ( & OrderedFloat ( f2) ) {
517
+ cmp:: Ordering :: Less => Ok ( n1) ,
518
+ cmp:: Ordering :: Equal => {
519
+ // Note: n1 and n2 were compared as floats,
520
+ // so we return the first argument as a floating point value.
521
+ Ok ( Number :: Float ( OrderedFloat ( f1) ) )
522
+ }
523
+ cmp:: Ordering :: Greater => Ok ( n2) ,
524
+ }
519
525
}
520
526
}
521
527
}
0 commit comments