ページ 11

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行で正しい結果が得られました。
ありがとうございました。