読者です 読者をやめる 読者になる 読者になる

細かい演算がうまくいかない

java カブロボ

きのうは以下のコードで終了しましたが、まともな結果がでないなど色々いじっているうちに

public double calcReward(double action, Stock stock) {
	double reward = 0.0;
	AssetManager am = AssetManager.getInstance();
	TimeManager tm = TimeManager.getInstance();
	long lastTotal = am.getAssetHistory(tm.getLastBusinessDay()).getTotalAssetValue();
	long todayTotal = am.getTotalAssetValue();
	System.out.print("lastTotal:" + lastTotal + ", todayTotal:" + todayTotal);
	double x = todayTotal / lastTotal - 1;
	//reward = Math.tanh(lastTotal / todayTotal);
	reward = Math.tanh(x);
	System.out.println("報酬は:" + reward);
	return reward;
}

午前中に下のコードに生まれ変わりました

public double calcReward(double action, Stock stock) {
	double reward = 0.0;
	AssetManager am = AssetManager.getInstance();
	TimeManager tm = TimeManager.getInstance();
	BigDecimal lastTotal = new BigDecimal(am.getAssetHistory(tm.getLastBusinessDay()).getTotalAssetValue());
	BigDecimal todayTotal = new BigDecimal(am.getTotalAssetValue());
	System.out.print("lastTotal:" + lastTotal + ", todayTotal:" + todayTotal);
	double x = todayTotal.divide(lastTotal, BigDecimal.ROUND_UP).doubleValue() - 1;
	//reward = Math.tanh(lastTotal / todayTotal);
	reward = Math.tanh(x);
	System.out.println("x:" + x + ",報酬は:" + reward);
	return reward;
}

でもちゃんとした値が出ません。
bigdecimal.divide(x, BigDecimal.ROUND_UP)のところの丸め指定を変えてはみたものの、うまくいきません。lastTotalとtodayTotalの比がたいていの場合小さすぎるのが問題。longからdoubleにキャストするとおかしな値になるし...、どうしたもんだか。

おかしな値と思ってたがおかしくなかった。でも、値が小さすぎる。こんな小さな報酬で大丈夫だろうか。
チョイ訂正したコード

public double calcReward(double action, Stock stock) {
	double reward = 0.0;
	AssetManager am = AssetManager.getInstance();
	TimeManager tm = TimeManager.getInstance();
	BigDecimal lastTotal = new BigDecimal(am.getAssetHistory(tm.getLastBusinessDay()).getTotalAssetValue());
	BigDecimal todayTotal = new BigDecimal(am.getTotalAssetValue());
	System.out.print("lastTotal:" + lastTotal + ", todayTotal:" + todayTotal);
	BigDecimal bigx = todayTotal.divide(lastTotal, 8, RoundingMode.HALF_UP).subtract(BigDecimal.ONE);
	double x = bigx.doubleValue();
	reward = Math.tanh(x);
	System.out.println(" bigx:" + bigx +" x:" + x + ",報酬は:" + reward);
	return reward;
}