double comparison fixes

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@32375 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2011-02-26 06:29:57 +00:00
parent 96318514aa
commit 0241a4347b
4 changed files with 56 additions and 81 deletions

View file

@ -1,3 +1,10 @@
2011-02-26 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSDecimal.m:
Fix NaN comparison in GSDecimalCompare()
* Source/NSNumber.m:
Better match OSX for double comparison.
2011-02-24 Richard Frith-Macdonald <rfm@gnu.org>
* Source/NSNumber.m:

View file

@ -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)

View file

@ -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];

View file

@ -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