2013年8月14日水曜日

変数を@()で囲ってNSNumberを生成する方法

NSNumberのリテラルで変数を@()で囲う方法は良く使います。
floatとdoubleで正しく処理が行われているかテストしてみました。

プログラムは、だいたいこんな感じにしました。
{
    double d1 = M_PI;
    NSNumber *num1 = @(d1);    // double変数をNSNumberに
        
    int ri= [num1 intValue];         // intで取得
    float rf = [num1 floatValue];    // floatで取得
    double rd = [num1 doubleValue];  // doubleで取得
        
    NSLog(@"NSNumber = %@",num1);
    NSLog(@"int = %d, float = %.20f, double = %.20f",ri,rf,rd);
}

{
    float f1 = M_PI;
    NSNumber *num1 = @(f1);    // float変数をNSNumberに
        
    int ri= [num1 intValue];
    float rf = [num1 floatValue];
    double rd = [num1 doubleValue];
        
    NSLog(@"NSNumber = %@",num1);
    NSLog(@"int = %d, float = %.20f, double = %.20f",ri,rf,rd);
}


M_PIはmath.hに以下のように定義されています。
#define M_PI        3.14159265358979323846264338327950288

結果は以下のように出力されて、floatとdoubleでちゃんと処理されているようでした。
@()にdouble型の変数を挟んだ時の方が、NSNumberでも精度が高く保存されているのが分かります。
NSNumber = 3.141592653589793
int = 3, float = 3.14159274101257324219, double = 3.14159265358979311600

NSNumber = 3.141593
int = 3, float = 3.14159274101257324219, double = 3.14159274101257324219
あたりまえといっちゃ、あたりまえなんですが、こういうのチェックしておかないと気持ち悪いですよね?

関連記事

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...