質問: ### 前提・実現したいこと processingでべき乗を計算するプログラムをかいています。具体的には、前提にaのn乗を求めるプログラムです。計算を簡単にする為、もし、nが偶数ならw=a^(n/2)としw×wを計算し、奇数ならw=a^(n-1/2)とし、w×w×aを計算します。 ### 発生している問題・エラーメッセージ ``` Type mismatch, "float" does not match with "int" ``` ### 該当のソースコード ``` void setup(){ noLoop(); } void draw(){ int a= 2 , n= 10 ; print(n+"-th power of "+a+" is "); println( power(a,n) ); } int power(int a, int n){ int w; if( n==0 ) return( 1 ); if( (n%2)==0) { w=pow(a,n/2); return( w*w ); } else{ w=pow(a,(n-1)/2); return( w*w*a );} } ``` ### 試したこと わからないので何もできませんでした。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: ProcessingはJavaベースなので、整数型の変数に浮動小数点型の値を入れようとする(情報が意図せず欠落することがある)のを許しません。 ですから、 ``` int w; //略 { w=pow(a,n/2); //略 else{ w=pow(a,(n-1)/2); ``` は、powが浮動小数点型を返し、それを整数型に入れようとするのでエラーになります。 > > 計算を簡単にする為 > > > 標準で提供されるような関数は十分に「揉まれて」いて、特別な条件下でなければ小手先の対策で高速になったりはなかなかしません...それで計算が簡単になるかというとちょっと疑問な点がありますが、とにかくその方針で計算するなら、 途中のwは整数の範囲に収まらない可能性があります(aの1/2乗が出てくるので)。wを浮動小数点型にする必要があるでしょう。そうすると、関数の戻りの型がintでここが同様の不整合になりますから、戻す時に `return (int)(w*w);` などと明示的にintに変換してやる必要がでてきます。 ついでに別件と言うか、むしろこちらの方が重要かも知れませんが... Javaでは(それを利用するProcessingでも)整数同士の演算は整数で閉じています(整数の範囲で計算されます)。1/2は、0.5になることはできず0になります。0.5を得るためには、計算に関与する要素の少なくともひとつを小数表記にします。1.0/2とか1/2.0とか、あるいは1.0/2.0でも構いませんけれど。整数型の変数a,bの間の計算なら、(float)a/b とか。