為替の予測プログラムの計算結果が
Cygwinとmacで違ってしまっていたので
しばらく悩んでいました
開発はmacでやりたいけれど
FXの発注はWindowsの方が便利なので
プログラムの実行をCygwinでやっていたんです
どうやらCygwinの計算結果がmacで実装した時と違っているのに気づいたのがお盆あたり
配列で組んでいたのを、vectorやmapで実装しなおした時期にあたります
ついでにfloat演算だったのをdoubleに書きなおしたり
思い当たる変更箇所がたくさんありすぎて特定に時間がかかりました
- 初期化されないクラスやメンバ変数
- 演算の丸め
特に、printfの浮動小数点型の丸め表示がCygwinとmacで違うために
かなり惑わされました…
実際に為替の予測結果に影響していたのは、
実数を割り算して整数に丸めるところでした
切り捨てしたいなら、floorを使わないと、結果が違ってしまうようです
macの中では、差はないのですが、Cygwinでは動作が違うんですね
1 2 |
int target signal.target / gridWidth; int target floor(signal.targetv / gridWidth); |
以下、実際のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void minGridInPAF(MinMaxGrid &grid, const money_t gridWidth) { grid.min = min(grid.min, this->grid.min); grid.max = max(grid.max, this->grid.max); if (NONE != signal.sign) { int vtg = static_cast<int>(floor(signal.targetv / gridWidth)); int htg = static_cast<int>(floor(signal.targeth / gridWidth)); if (0 < vtg) { grid.min = min(grid.min, vtg); grid.max = max(grid.max, vtg); } if (0 < htg) { grid.min = min(grid.min, htg); grid.max = max(grid.max, htg); } } } |
他に、初期化されていない変数がどこかにあるようなのだけれど
macでvalgrindをかけても見つからず
徹底的に初期化を追加したものの解決しないので
使用前に無駄な代入文をいれて回避しました
これは今後の課題