1行で計算すると正しくなくて、2行に分けると正しい結果が得られる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やまっち
記事: 20
登録日時: 8年前

1行で計算すると正しくなくて、2行に分けると正しい結果が得られる

#1

投稿記事 by やまっち » 7年前

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);
}

box
記事: 2002
登録日時: 13年前

Re: 1行で計算すると正しくなくて、2行に分けると正しい結果が得られる

#2

投稿記事 by box » 7年前

やまっち さんが書きました:

コード:

	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;
のようにキャストすればいいような気がします。実験はしていませんが。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

やまっち
記事: 20
登録日時: 8年前

Re: 1行で計算すると正しくなくて、2行に分けると正しい結果が得られる

#3

投稿記事 by やまっち » 7年前

box さん、回答して頂いてありがとうございました。
右辺の方に関する説明も理解できました。

> result = (__int64) 284480 * F / L;
> のようにキャストすればいいような気がします。実験はしていませんが。

に付いて、こちらの環境では、確かに1行で正しい結果が得られました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る