4

コードは次のとおりです。

NSDecimalNumber *test=[[NSDecimalNumber alloc] initWithInt:65];
number3=[[NSDecimalNumber one] decimalNumberByDividingBy:[[[NSDecimalNumber alloc] initWithInt:10] decimalNumberByRaisingToPower:test.integerValue]];
number3=[number3 decimalNumberByMultiplyingBy:number3];

プログラムがアンダーフロー例外で終了することを期待していましたが、そうではありませんでした。さらに、NSLog を取得すると、number3 が巨大な数として得られます。「test」を 64 未満に変更すると、正しい出力 (つまり、10^(-2*test)) が得られます。ここで何が起こっているか知っている人はいますか?つまり、回避するのは非常に簡単ですが、何かが欠けていない限り (かなり可能性があります)、NSDecimalNumber クラスのエラーのようです。

4

1 に答える 1

2

これはバグのようです。

NSDecimalNumber-128 から +127 までの指数をサポートすることが文書化されています。明らかに、(10 -65 ) 2の指数は -130 であり、範囲外です。ただし、例外を発生させる代わりに、-130 を +126 にラップしています。

文書化されたデフォルトの動作NSDecimalNumber、「メソッドは、必要な精度が有効桁数 38 桁を超えないことを前提としており、0 で割ろうとしたり、表現するには大きすぎたり小さすぎたりする数値を生成しようとすると、例外を発生させます。」</p>

例外が発生していないので、バグを見つけたと思います。http://bugreport.apple.com/で報告できます。

于 2013-01-09T05:58:21.493 に答える