File tree 2 files changed +17
-0
lines changed
2 files changed +17
-0
lines changed Original file line number Diff line number Diff line change @@ -1743,6 +1743,7 @@ IEEEFloat::opStatus IEEEFloat::remainder(const IEEEFloat &rhs) {
1743
1743
IEEEFloat::opStatus IEEEFloat::mod (const IEEEFloat &rhs) {
1744
1744
opStatus fs;
1745
1745
fs = modSpecials (rhs);
1746
+ unsigned int origSign = sign;
1746
1747
1747
1748
while (isFiniteNonZero () && rhs.isFiniteNonZero () &&
1748
1749
compareAbsoluteValue (rhs) != cmpLessThan) {
@@ -1754,6 +1755,8 @@ IEEEFloat::opStatus IEEEFloat::mod(const IEEEFloat &rhs) {
1754
1755
fs = subtract (V, rmNearestTiesToEven);
1755
1756
assert (fs==opOK);
1756
1757
}
1758
+ if (isZero ())
1759
+ sign = origSign; // fmod requires this
1757
1760
return fs;
1758
1761
}
1759
1762
Original file line number Diff line number Diff line change @@ -3289,6 +3289,20 @@ TEST(APFloatTest, mod) {
3289
3289
EXPECT_EQ (f1.mod (f2), APFloat::opInvalidOp);
3290
3290
EXPECT_TRUE (f1.isNaN ());
3291
3291
}
3292
+ {
3293
+ APFloat f1 (APFloat::IEEEdouble (), " -4.0" );
3294
+ APFloat f2 (APFloat::IEEEdouble (), " -2.0" );
3295
+ APFloat expected (APFloat::IEEEdouble (), " -0.0" );
3296
+ EXPECT_EQ (f1.mod (f2), APFloat::opOK);
3297
+ EXPECT_TRUE (f1.bitwiseIsEqual (expected));
3298
+ }
3299
+ {
3300
+ APFloat f1 (APFloat::IEEEdouble (), " -4.0" );
3301
+ APFloat f2 (APFloat::IEEEdouble (), " 2.0" );
3302
+ APFloat expected (APFloat::IEEEdouble (), " -0.0" );
3303
+ EXPECT_EQ (f1.mod (f2), APFloat::opOK);
3304
+ EXPECT_TRUE (f1.bitwiseIsEqual (expected));
3305
+ }
3292
3306
}
3293
3307
3294
3308
TEST (APFloatTest, PPCDoubleDoubleAddSpecial) {
You can’t perform that action at this time.
0 commit comments