int OP double を double で演算するパッチ
HSP では int OP double が int で演算され、 たとえば 100 * 0.9 で 0 が返ってきたりするのが HSP の不満ポイントの一つなんですが。
int OP double を double で演算するパッチを作ってみました。
Index: hsp3code.cpp =================================================================== --- hsp3code.cpp (リビジョン 99) +++ hsp3code.cpp (作業コピー) @@ -258,6 +258,15 @@ } } + // int OP double は double で演算する + double dval; + ptr = STM_GETPTR(stm1); + if ( tflag == HSPVAR_FLAG_INT && stm2->type == HSPVAR_FLAG_DOUBLE ) { + tflag = HSPVAR_FLAG_DOUBLE; + dval = (double)*(int *)ptr; + ptr = (char *)&dval; + } + mpval = HspVarCoreGetPVal( tflag ); varproc = HspVarCoreGetProc( tflag ); @@ -268,7 +277,7 @@ HspVarCoreClearTemp( mpval, tflag ); // 最小サイズのメモリを確保 } - varproc->Set( mpval, (PDAT *)mpval->pt, STM_GETPTR(stm1) ); // テンポラリ変数に初期値を設定 + varproc->Set( mpval, (PDAT *)mpval->pt, ptr ); // テンポラリ変数に初期値を設定 ptr = STM_GETPTR(stm2); if ( tflag != stm2->type ) { // 型が一致しない場合は変換
サンプル
#define test(%1) mes "(%1 ) = " + (%1) test 1 + 1 test 1.0 + 1 test 1 + 1.0 test 1 == 1.0 test 1.0 == 1 test 1.2 == 1 test 1 == 1.2 test 1.2 <= 1 test 1 >= 1.2 test 100 * 0.9
従来の結果
( 1 + 1 ) = 2 ( 1.0 + 1 ) = 2.000000 ( 1 + 1.0 ) = 2 ( 1 == 1.0 ) = 1 ( 1.0 == 1 ) = 1 ( 1.2 == 1 ) = 0 ( 1 == 1.2 ) = 1 ( 1.2 <= 1 ) = 0 ( 1 >= 1.2 ) = 1 ( 100 * 0.9 ) = 0
このパッチを当てて実行した結果
( 1 + 1 ) = 2 ( 1.0 + 1 ) = 2.000000 ( 1 + 1.0 ) = 2.000000 ( 1 == 1.0 ) = 1 ( 1.0 == 1 ) = 1 ( 1.2 == 1 ) = 0 ( 1 == 1.2 ) = 0 ( 1.2 <= 1 ) = 0 ( 1 >= 1.2 ) = 0 ( 100 * 0.9 ) = 90.000000
追記
MLに送りましたが、互換性の問題で取り込みは出来ないそうですー。