LoginSignup
1
0

More than 5 years have passed since last update.

自動四捨五入トラップ

Last updated at Posted at 2013-05-20

整数の cast が切り捨てでなく四捨五入になる場合がある。

次は全部1になる。

# python じゃないよ。Booだよ。
for v in (1.3, 1.4, 1.5, 1.6):
    print v cast int

次は何故か1.5と1.6が2になる。

# python じゃないよ。Booだよ。
for v as object in (1.3, 1.4, 1.5, 1.6):
    print v cast int

object が duck になっても同じ。

コンパイラソースを追って見る

  • Boo のILコード出力は EmitAssembly クラス(コンパイラパイプラインの1ステップ=ICompilerStep)
  • cast 演算子のコード出力は OnCastExpression() メソッド(EmitAssemblyは構文木visitor)。
  • OnCastExpression() → LoadExpressionWithType() → EmitCastIfNeeded() と呼び出し。
  • EmitCastIfNeeded() は変換元/変換先の型から必要なコード出力。ここでobject/duck(value型でない場合)からint等の型へ変換する場合、ランタイムの変換メソッドを呼ぶコードになる。
  • その変換メソッドが四捨五入らしい。

結論

object や duck の primitive 型への変換はILダイレクトではないから遅い(あたりまえ)。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0