Skip to content

Commit 6318c77

Browse files
committed
Explicitly handle min/max for -0.0 and +0.0
1 parent 66da074 commit 6318c77

File tree

1 file changed

+30
-4
lines changed
  • quaddtype/numpy_quaddtype/src

1 file changed

+30
-4
lines changed

quaddtype/numpy_quaddtype/src/ops.hpp

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -514,26 +514,52 @@ quad_mod(const Sleef_quad *a, const Sleef_quad *b)
514514
static inline Sleef_quad
515515
quad_minimum(const Sleef_quad *in1, const Sleef_quad *in2)
516516
{
517-
return Sleef_iunordq1(*in1, *in2) ? (Sleef_iunordq1(*in1, *in1) ? *in1 : *in2)
518-
: Sleef_fminq1(*in1, *in2);
517+
if (Sleef_iunordq1(*in1, *in2)) {
518+
return Sleef_iunordq1(*in1, *in1) ? *in1 : *in2;
519+
}
520+
// minimum(-0.0, +0.0) = -0.0
521+
if (Sleef_icmpeqq1(*in1, QUAD_ZERO) && Sleef_icmpeqq1(*in2, QUAD_ZERO)) {
522+
return Sleef_icmpleq1(Sleef_copysignq1(QUAD_ONE, *in1), Sleef_copysignq1(QUAD_ONE, *in2)) ? *in1 : *in2;
523+
}
524+
return Sleef_fminq1(*in1, *in2);
519525
}
520526

521527
static inline Sleef_quad
522528
quad_maximum(const Sleef_quad *in1, const Sleef_quad *in2)
523529
{
524-
return Sleef_iunordq1(*in1, *in2) ? (Sleef_iunordq1(*in1, *in1) ? *in1 : *in2)
525-
: Sleef_fmaxq1(*in1, *in2);
530+
if (Sleef_iunordq1(*in1, *in2)) {
531+
return Sleef_iunordq1(*in1, *in1) ? *in1 : *in2;
532+
}
533+
// maximum(-0.0, +0.0) = +0.0
534+
if (Sleef_icmpeqq1(*in1, QUAD_ZERO) && Sleef_icmpeqq1(*in2, QUAD_ZERO)) {
535+
return Sleef_icmpgeq1(Sleef_copysignq1(QUAD_ONE, *in1), Sleef_copysignq1(QUAD_ONE, *in2)) ? *in1 : *in2;
536+
}
537+
return Sleef_fmaxq1(*in1, *in2);
526538
}
527539

528540
static inline Sleef_quad
529541
quad_fmin(const Sleef_quad *in1, const Sleef_quad *in2)
530542
{
543+
if (Sleef_iunordq1(*in1, *in2)) {
544+
return Sleef_iunordq1(*in2, *in2) ? *in1 : *in2;
545+
}
546+
// fmin(-0.0, +0.0) = -0.0
547+
if (Sleef_icmpeqq1(*in1, QUAD_ZERO) && Sleef_icmpeqq1(*in2, QUAD_ZERO)) {
548+
return Sleef_icmpleq1(Sleef_copysignq1(QUAD_ONE, *in1), Sleef_copysignq1(QUAD_ONE, *in2)) ? *in1 : *in2;
549+
}
531550
return Sleef_fminq1(*in1, *in2);
532551
}
533552

534553
static inline Sleef_quad
535554
quad_fmax(const Sleef_quad *in1, const Sleef_quad *in2)
536555
{
556+
if (Sleef_iunordq1(*in1, *in2)) {
557+
return Sleef_iunordq1(*in2, *in2) ? *in1 : *in2;
558+
}
559+
// maximum(-0.0, +0.0) = +0.0
560+
if (Sleef_icmpeqq1(*in1, QUAD_ZERO) && Sleef_icmpeqq1(*in2, QUAD_ZERO)) {
561+
return Sleef_icmpgeq1(Sleef_copysignq1(QUAD_ONE, *in1), Sleef_copysignq1(QUAD_ONE, *in2)) ? *in1 : *in2;
562+
}
537563
return Sleef_fmaxq1(*in1, *in2);
538564
}
539565

0 commit comments

Comments
 (0)