diff --git a/ChangeLog b/ChangeLog index 4dfde9e22..33e0362aa 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2011-02-26 Richard Frith-Macdonald + + * Source/NSDecimal.m: + Fix NaN comparison in GSDecimalCompare() + * Source/NSNumber.m: + Better match OSX for double comparison. + 2011-02-24 Richard Frith-Macdonald * Source/NSNumber.m: diff --git a/Source/NSDecimal.m b/Source/NSDecimal.m index 63ddc42b8..abff33207 100644 --- a/Source/NSDecimal.m +++ b/Source/NSDecimal.m @@ -172,6 +172,14 @@ GSDecimalCompare(const GSDecimal *leftOperand, const GSDecimal *rightOperand) int s1 = leftOperand->exponent + leftOperand->length; int s2 = rightOperand->exponent + rightOperand->length; + if (leftOperand->validNumber != rightOperand->validNumber) + { + if (rightOperand->validNumber) + return NSOrderedDescending; + else + return NSOrderedAscending; + } + if (leftOperand->isNegative != rightOperand->isNegative) { if (rightOperand->isNegative) diff --git a/Source/NSDecimalNumber.m b/Source/NSDecimalNumber.m index 09098cb9e..a026370b7 100644 --- a/Source/NSDecimalNumber.m +++ b/Source/NSDecimalNumber.m @@ -202,6 +202,7 @@ static NSDecimalNumber *one; { return maxNumber; } + + (NSDecimalNumber*) minimumDecimalNumber { return minNumber; @@ -712,6 +713,10 @@ static NSDecimalNumber *one; { return NSOrderedSame; } + if (self == notANumber) + { + return NSOrderedAscending; // NaN is considered less than anything + } if ([decimalNumber isKindOfClass: NSDecimalNumberClass]) { NSDecimal d1 = [self decimalValue]; diff --git a/Source/NSNumber.m b/Source/NSNumber.m index 10f995852..eb766a707 100644 --- a/Source/NSNumber.m +++ b/Source/NSNumber.m @@ -101,6 +101,39 @@ if (value > other)\ }\ return NSOrderedSame; +#define DCOMPARE(value, other) \ + if (isnan(value)) \ + { \ + if (isnan(other)) \ + { \ + return NSOrderedSame; \ + } \ + else \ + { \ + return NSOrderedAscending; \ + } \ + } \ + else \ + { \ + if (isnan(other)) \ + { \ + if (value < 0.0) \ + { \ + return NSOrderedAscending; \ + } \ + return NSOrderedDescending; \ + } \ + else if (value < other) \ + { \ + return NSOrderedAscending; \ + } \ + else if (value > other) \ + { \ + return NSOrderedDescending; \ + } \ + return NSOrderedSame; \ + } + @implementation NSSignedIntegerNumber - (NSComparisonResult) compare: (NSNumber*)aNumber { @@ -164,33 +197,7 @@ return NSOrderedSame; double other = [aNumber doubleValue]; double value = [self doubleValue]; - if (isnan(value)) - { - if (isnan(other)) - { - return NSOrderedSame; - } - else - { - return NSOrderedAscending; - } - } - else - { - if (isnan(other)) - { - return NSOrderedDescending; - } - else if (value < other) - { - return NSOrderedAscending; - } - else if (value > other) - { - return NSOrderedDescending; - } - return NSOrderedSame; - } + DCOMPARE(value, other) } default: [NSException raise: NSInvalidArgumentException @@ -267,33 +274,7 @@ return NSOrderedSame; double other = [aNumber doubleValue]; double selfv = [self doubleValue]; - if (isnan(selfv)) - { - if (isnan(other)) - { - return NSOrderedSame; - } - else - { - return NSOrderedAscending; - } - } - else - { - if (isnan(other)) - { - return NSOrderedDescending; - } - else if (selfv < other) - { - return NSOrderedAscending; - } - else if (selfv > other) - { - return NSOrderedDescending; - } - return NSOrderedSame; - } + DCOMPARE(selfv, other) } default: [NSException raise: NSInvalidArgumentException @@ -336,33 +317,7 @@ return NSOrderedSame; other = [aNumber doubleValue]; value = [self doubleValue]; - if (isnan(value)) - { - if (isnan(other)) - { - return NSOrderedSame; - } - else - { - return NSOrderedAscending; - } - } - else - { - if (isnan(other)) - { - return NSOrderedDescending; - } - else if (value < other) - { - return NSOrderedAscending; - } - else if (value > other) - { - return NSOrderedDescending; - } - return NSOrderedSame; - } + DCOMPARE(value, other) } @end