gnustep-dev
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

NSNumber Bug I can't fix


From: Marcus Müller
Subject: NSNumber Bug I can't fix
Date: Thu, 17 Feb 2011 16:19:50 +0100

Hi,

I just stumbled across a bug in NSNumber that I can't fix as I don't understand the NSNumber code. The problem is easy to see, though:

#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSNumber *n   = [NSNumber numberWithInt:2];
NSNumber *nan = [NSDecimalNumber notANumber];

NSLog(@"%@ (class:%@ double:%g) == %@ -> %s",
  n, NSStringFromClass([n class]), [n doubleValue],
  nan, [n isEqualToNumber:nan] ? "YES" : "NO");

[pool release];
return 0;
}

On FreeBSD-8.2rc3 (amd64) this produces the following output:
2011-02-17 16:02:15.316 NumberTest[59574] 2 (class:NSIntNumber double:2) == NaN -> YES
Which is clearly wrong.

I came across this issue via NSNumberFormatter, which instead of formatting any integer numbers always printed NaN. In my project  I tried to debug into the issue and found this:
769  if ([anObject isEqual: [NSDecimalNumber notANumber]])
(gdb) s
-[NSNumber isEqual:] (self=0x803e8d1d0, _cmd=0x801410980, anObject=0x805e625c0)
    at NSNumber.m:376
376  if ([anObject isKindOfClass: NSNumberClass])
(gdb) n
378      return [self isEqualToNumber: anObject];
(gdb) po anObject
NaN
(gdb) po [anObject class]
NSDecimalNumber
(gdb) s
-[NSNumber isEqualToNumber:] (self=0x803e8d1d0, _cmd=0x80140d300, 
    aNumber=0x805e625c0) at NSNumber.m:371
371  return ([self compare: aNumber] == NSOrderedSame) ? YES : NO;
(gdb) s
-[NSSignedIntegerNumber compare:] (self=0x803e8d1d0, _cmd=0x80140d2e0, 
    aNumber=0x805e625c0) at NSNumber.m:107
107  if (aNumber == self)
[…]
(gdb) n
165  double value = [self doubleValue];
(gdb) p other
$3 = nan(0x8000000000000)
(gdb) p value
$4 = 6.9533556002420585e-310

As you can see above, asking an NSIntNumber instance for its doubleValue works properly, however, it fails at NSNumber.m:165. I don't know the reason, but I also don't understand the implications of the macros used. Can somebody elaborate? Please note that I'm on a 64-bit (amd64) system.

Thanks,


  Marcus


-- 

Marcus Mueller  .  .  .  crack-admin/coder ;-)

Mulle kybernetiK  .  http://www.mulle-kybernetik.com

Current projects: http://www.mulle-kybernetik.com/znek/



Attachment: smime.p7s
Description: S/MIME cryptographic signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]