mirror of
https://github.com/gnustep/libs-base.git
synced 2025-04-22 16:33:29 +00:00
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:
parent
96318514aa
commit
0241a4347b
4 changed files with 56 additions and 81 deletions
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in a new issue