ページ 1 / 1
1行で計算すると正しくなくて、2行に分けると正しい結果が得られる
Posted: 2017年2月08日(水) 19:45
by やまっち
Windows7 64bit
C:\borland\bcc55\Bin>bcc32
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
Syntax is: BCC32 [ options ] file
* = default; -x- = turn switch x off
を使っています。
以下のコードで
1行で計算すると正しくなくて、2行に分けると正しい結果が得られる
のですが、その理由を教えて頂きたいです。
よろしくお願いします。
コード:
#include <stdio.h>
void main(){
int L = 30*16383;
int F = 16383;
__int64 result;
result=284480*F/L; // 1行で計算すると result= 743 となって正しくない
printf("%I64u\n", result);
result=284480; // 1行目
result=result*F/L; // 2行目 → 2行に分けると正しい結果 (9482) が得られる
printf("%I64u", result);
}
Re: 1行で計算すると正しくなくて、2行に分けると正しい結果が得られる
Posted: 2017年2月08日(水) 21:05
by box
やまっち さんが書きました:
コード:
result=284480*F/L; // 1行で計算すると result= 743 となって正しくない
右辺の計算の途中で、int型で表わせる数値の範囲を超えているように思います。
やまっち さんが書きました:
コード:
result=284480; // 1行目
result=result*F/L; // 2行目 → 2行に分けると正しい結果 (9482) が得られる
こっちは、1行目で__int64型の変数に値を代入「した後で」続きの計算をしていますね。このように、__int64とintが混在しているとき、
2行目の右辺の型は最も大きい__int64型となるので、何も問題がない、ということでありましょう。
1行で片づけるには、たぶん
コード:
result = (__int64) 284480 * F / L;
のようにキャストすればいいような気がします。実験はしていませんが。
Re: 1行で計算すると正しくなくて、2行に分けると正しい結果が得られる
Posted: 2017年2月09日(木) 22:45
by やまっち
box さん、回答して頂いてありがとうございました。
右辺の方に関する説明も理解できました。
> result = (__int64) 284480 * F / L;
> のようにキャストすればいいような気がします。実験はしていませんが。
に付いて、こちらの環境では、確かに1行で正しい結果が得られました。
ありがとうございました。