2009-03-31 15 views
1

SimulatorのiPhone SDKで整数を浮動小数点数と混合すると、単純な計算でエラーが発生することに気付きました。 2つの例:iPhoneのCocoa混合モードの数学の基本的なエラー

float testVal1 = 10 + 5/10; 
//evaluates to 10 instead of 10.5 unless I use explicit 10.0f.. 

// Problem Code mixed float int 
NSUInteger jvalue = 2312345; 

NSInteger testVal2 = (jvalue - 2512345); // evaluates correctly 
float testVal3 = (jvalue - 2512345); // fails with some huge bogus value 

混合モード式では、浮動小数点値に変換されると考えました。浮動小数点数を使用している間は何もないと思われる

ここで何が問題になりますか?

答えて

4

何も問題ありません。これが操作の仕方です。あなたの例を見てみましょう:

float testVal1 = 10 + 5/10; //evaluates to 10 

は、ここで、ここで一連の操作です:

  1. 5を分析:整数リテラル
    • は10を分析:
    • 5/10整数リテラル:整数除算結果0
    • 10 + [0]:整数加算、結果10
    • この作品にあなたが望む方法を作成するには

をfloatに結果を割り当て、分割オペランドの少なくとも一つは、浮動小数点でなければなりません。結果は今よりこのようになります。

  1. 5分析:整数リテラルを
    • 10.0f分析:浮動小数点リテラル
    • 5/10.0f:浮動小数点分割を、結果0.5
    • 10+ [0.5]:浮動小数点加算、結果10.5
    • floatに結果を代入
+0

10.0fの代わりに10.0が機能するはずです。 – sigjuice

2

これは、Objective-CのとCは、算術演算を実行する方法に関係している、iPhoneやシミュレータとは何の関係もありません。コンパイラはオペランドを5/10に整数として解釈し、整数除算は定義によって分数結果にはなりません。したがって、あなたが試してみてください10 + 5/10 == 10 + 0 == 10:オペランドの一方が、そうでない場合は言うまで5/10のような部分式で

float testVal1 = 10.0f + 5.0f/10.0f; 
1

デフォルトのデータ型は整数です。しかし、整数除算による(5/10) = 0

NSInteger testVal2 = (jvalue - 2512345);では、デフォルト式のサブ式は符号なし整数です。あなたの否定的な結果は、アンダーフローと偽の値を引き起こします。

関連する問題