今回、異なるデータ型の計算で疑問に思ったことがあるので投稿致します。
事の発端は、物理シュミレーションで投げ上げを再現しようとしていたことにあります。
しかし、うまく動かず、原因がデータ型の異なる計算にあること(恐らく)までは発見しました。
ミスを再現したプログラムが以下になります。
#include <stdio.h> #include <math.h> void main() { int v0=-20; unsigned int nowcnt=300; double g=2.3333333; printf("%f",v0*nowcnt+g*pow(double(nowcnt), 2.0)/2); }これを実行しますと、出力がえらいことになります。
これを、
printf("%f",v0*(int)nowcnt+g*pow(double(nowcnt), 2.0)/2);
としますと、正しい出力が得られました。v0を、
v0=20;
と正値にしても正しい結果が得られました。
ミスは恐らく、unsigned int型とint型(値は負)を乗算しているからだと思うのですが、正しいでしょうか?
また、この手のことはコンパイラに依存することなのでしょうか?(ちなみに、コンパイラは警告しませんでした。)
つまるところ、解決法はわかったが、原因がよくわかっていない状態です。
どうか、ご教授お願いします。
環境は、Visual C++ 2005 Express Editionです。