My work with NSDecimal values has turned up several bugs and a documentation
error. Most of these bugs are extant under Mac OS X 10.5.7, and are FIXED
under Mac OS X 10.6 (10A380).

For the record:

 All bugs are extant under Mac OS X 10.5.7
 

 Extant under Mac OS X 10.6 (10A380):

 NSDecimalPower() chokes on small numbers
 NSDecimalIsNotANumber() incorrect documentation
 

 FIXED under Mac OS X 10.6 (10A380):
 
 NSDecimalAdd() bug
 NSDecimalSubtract() bug
 NSDecimalCompare() bug
 NSDecimalNormalize() drops very small fraction


NSDecimalAdd() and NSDecimalSubtract() return incorrect results when adding
or subtracting a very small number to or from a larger number.

NSDecimalCompare() incorrectly compared NSDecimal one with NSDecimal
1+1e-34, returning NSOrderedSame when NSOrderedAscending was expected.

NSDecimalNormalize() normalized 1+1e-34 to 1.0 .

These issues are extant under Mac OS X 10.5.7 and FIXED under Mac OS X 10.6
(10A380)

Not fixed is the NSDecimalPower() bug already noted. Also, the documentation
for NSDecimalIsNotANumber() has the return values YES and NO reversed.

Bug reports:

NSDecimalPower():  7452166
NSDecimalIsNotANumber() documentation:  7452179


Tom Bernard
tombern...@bersearch.com



on 11/21/09 7:41 AM, Tom Bernard wrote:

> Before reporting this as a bug to Apple's Bug Reporter, I would like
> feedback from the community. I am working in Leopard. Has this been fixed in
> Snow Leopard? Is there something else I am overlooking?
> 
> NSDecimalPower returns an unexpected result when I raise 1e-35 to the 4th
> power. I understand that the result is too small to be supported by
> NSDecimal. The returned result:
> 
> 100000000000000000000000000000000000000000000000000000000000000000000000000\
> 000000000000000000000000000000000000000000 and err = NSCalculationNoError
> 
>  does not make sense to me. I was expecting a return of 0 and an err =
> NSCalculationLossOfPrecision.
> 
>  
> To reproduce:
> 
> 1) create a new Foundation Tool and implement the following code:
> 
> #import <Foundation/Foundation.h>
> 
> #define NSDStr(x) NSDecimalString(&x, nil)
> 
> 
> int main (int argc, const char * argv[]) {
>     NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
> 
>     NSCalculationError    err;
>     
>     // NSDecimalPower bug
>     // pow(0.0000000000000000000000000000000000001, 4);
>     // result is less than minimum NSDecimal; NSDecimalPower should return 0
> with err = NSCalculationLossOfPrecision
>     // (NSCalculationOverflow, NSCalculationUnderflow also understandable)
>     //
>     // instead returns
> 1000000000000000000000000000000000000000000000000000000000000000000000000000
> 00000000000000000000000000000000000000000
>     // with err = NSCalculationNoError
>     
>     NSDecimal        oneEminusThirtyFive, oneEminusThirtyFiveToFourthPower;
>     NSString        *oneEminusThirtyFiveStr,
> *oneEminusThirtyFiveToFourthPowerStr;
>     NSUInteger        n;
>     
>     n = 4;
>     oneEminusThirtyFive =    [[NSDecimalNumber decimalNumberWithMantissa:1
> exponent:-35 isNegative:NO] decimalValue];
>     err =        
> NSDecimalPower(&oneEminusThirtyFiveToFourthPower, &oneEminusThirtyFive, n,
> NSRoundPlain);
>     
>     oneEminusThirtyFiveStr =                NSDStr(oneEminusThirtyFive);
>     oneEminusThirtyFiveToFourthPowerStr =
> NSDStr(oneEminusThirtyFiveToFourthPower);
>     
>     printf("oneEminusThirtyFive = %s\n",
> [oneEminusThirtyFiveStr UTF8String]);
>     printf("oneEminusThirtyFiveToFourthPower = %s\n",
> [oneEminusThirtyFiveToFourthPowerStr UTF8String]);
>     printf("err = %u\n",                                err);
>     printf("\n");
>     
>     
>     [pool drain];
>     return 0;
> }
> 
> 
> The above code outputs:
> 
> oneEminusThirtyFive = 0.00000000000000000000000000000000001
> oneEminusThirtyFiveToFourthPower =
> 1000000000000000000000000000000000000000000000000000000000000000000000000000
> 00000000000000000000000000000000000000000
> err = 0


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to