2011-12-26 6 views
4

を2倍にフロートから3.0コンパイラ自動キャスト:DX、DY、およびDXYがフロートしているアップルLLVMコードの一部であり

*det_ptr++ = (float)(dx*dy - 0.81*dxy*dxy);

が。

アップルLLVM 3.0コンパイラはそれのために、以下の組み立てを行います

+0x250 vldr.32      s0, [r13, #+140] 
+0x254 vldr.32      s1, [r13, #+136] 
+0x258 vmul.f32      s0, s0, s1 
+0x25c vcvt.f64.f32     d16, s0 <-------------- cast from float to double 
+0x260 vldr.32      s0, [r13, #+132] 
+0x264 vcvt.f64.f32     d17, s0 <-------------- cast from float to double 
+0x268 vldr.64      d18, [r13, #+16] 
+0x26c vmul.f64      d17, d18, d17 
+0x270 vldr.32      s0, [r13, #+132] 
+0x274 vcvt.f64.f32     d19, s0 <-------------- cast from float to double 
+0x278 vmul.f64      d17, d17, d19 
+0x27c vsub.f64      d16, d16, d17 
+0x280 vcvt.f32.f64     s0, d16 
+0x284 ldr       r0, [sp, #+104] 
+0x286 adds       r1, r0, #4 ; 0x4 
+0x288 str       r1, [sp, #+104] 
+0x28a vstr.32      s0, [r0] 

は、これらのキャストを禁止する方法はありますか?

答えて

10

あなたのプログラムを書いた方法には、これらのキャストが必要です。 0.81は倍精度リテラルであるため、乗算を行う前にdxyをdoubleに昇格し、引き算の前にdx*dyを昇格させる必要があります。最終結果を浮動させるという事実は重要ではありません.Cの標準は、これらの用語が関係なく倍精度で評価されることは完全に明確です。答えを

*det_ptr++ = dx*dy - 0.81f*dxy*dxy; 
+0

感謝を:(fサフィックスを追加することによって)の代わりにリテラル単精度を使用し、倍増するプロモーションを防ぐため

! – Alex

+0

@Alex:喜んで助けてください。 –

関連する問題