Eguchiです
Togawa Satoshi wrote:
> とがわと申します。
> # 多分実装依存の話なので、Followup-To: fj.os.linux としますが、
> # もっと適切なニュースグループをご存知の方は移動をよろしくです。
>
> Debian/GNU Linux(potatoとslink)上で、gccを使ってプログラムを書いています。
>
> potatoの方は、CPUはPentiumIIで、
> $ gcc -v
> Reading specs from /usr/lib/gcc-lib/i386-linux/2.95.2/specs
> gcc version 2.95.2 19991109 (Debian GNU/Linux)
>
> slinkの方は、CPUはPentiumIIIで、
> $ gcc -v
> Reading specs from /usr/lib/gcc-lib/i486-linux/2.7.2.3/specs
> gcc version 2.7.2.3
>
> 次のようなプログラムを書きました。
> #include <stdio.h>
> main(){
> double a,b,c;
> int d;
> a=0.5;
> b=0;
> c=0.1;
> d=(int)((a-b)/c);
> printf("%d", d);
> }
>
> (0.5-0)/0.1 = 5を計算する簡単なプログラムですが、これを実行すると、
> 4
> と表示されます。(potato, slinkとも)
>
> 同じプログラムを、FreeBSD(98)2.2.8で計算した時には、
> 5
> と表示されました。
>
> 原因が分からないのですが、
> 1. プログラムの書き方が悪い。
> 2. ライブラリにバグがある。
> 3. OSにバグがある。
> 4. CPUにバグがある。
> の、どれなんでしょうか?
>
> ----
> ( togawa _at_ statp.is.tohoku.ac.jp || splashwave _at_ geocities.co.jp ) 戸川聡士
(1)です。明示的にintでキャスティングしているので少数点以下が切り捨てられます。
浮動小数点レジスタから整数として取り出すか、取り出してから整数に変換するかは
(2)のライブラリに依存するはずです。
(3)は考えられません。というよりも対象外です。
(4)は初期のペンティアムの一部のロットであるならばその可能性もあります。
浮動小数点の内部形式は御存知ですよね?
環境に依存せず意図的な処理には ceil() floor()を使えばいいでしょう。
#変数 C で割り算するよりも Cの逆数を掛けた方がいいと思う