掲示板ランキング  インターネット・Web開発(セキュリティー管理)


掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板1

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧

No.6653

小数点以下の表示について
投稿者---yotu(2006/10/21 15:02:34)


3つの整数を入力、平均値を出力するプログラムを作りました。
[プログラム]
#include<stdio.h>
int main(){
    int a,b,c;
    float f;
    scanf("%d  %d  %d",&a,&b,&c);
    f=a+b+c;
    printf("[%d,%d,%d]heikin=%1.15f\n",a,b,c,f/3);
    f/=3;
    printf("[%d,%d,%d]heikin=%1.15f\n",a,b,c,f);
    return 0;
}

[環境]Borland C++ Compiler5.5 winXP sp2
出力時に変数を3で割る場合(前者)と
3で割った値を変数に代入し出力する場合(後者)とでは
結果が異なるのはなぜでしょうか。誰か教えてください。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:小数点以下の表示について 6654 Hermit 2006/10/21 16:22:20


No.6654

Re:小数点以下の表示について
投稿者---Hermit(2006/10/21 16:22:20)


前者は、double で計算されて渡されるけど、
後者は、float に格納され、精度が落ちるってことではないかと思いますが。


この投稿にコメントする

削除パスワード

No.6656

Re:小数点以下の表示について
投稿者---yotu(2006/10/22 09:23:35)


ありがとうございます、おかげで謎が解けました。
調べてみると常にdouble型で計算すると書いてありました。


この投稿にコメントする

削除パスワード

No.6657

Re:小数点以下の表示について
投稿者---たかぎ(2006/10/22 11:19:36)
http://takagi.in/


>調べてみると常にdouble型で計算すると書いてありました。

たぶん、その理解は間違っています。



この投稿にコメントする

削除パスワード

No.6662

Re:小数点以下の表示について
投稿者---yotu(2006/10/23 19:35:05)


>たぶん、その理解は間違っています。
C/C++では「実数演算は原則として倍精度で行う」と書いてありました。
2-3年前の古い本なので間違いがあったのでしょうか?


この投稿にコメントする

削除パスワード

No.6683

Re:小数点以下の表示について
投稿者---たかぎ(2006/10/25 15:02:33)
http://takagi.in/


>C/C++では「実数演算は原則として倍精度で行う」と書いてありました。
>2-3年前の古い本なので間違いがあったのでしょうか?

前後の文脈が分からないので正確なことは言えませんが、少なくとも、

> 実数演算は原則として倍精度で行う

ということであれば、常に倍精度で行うわけではないことは明らかですね。



この投稿にコメントする

削除パスワード

No.6687

Re:小数点以下の表示について
投稿者---yotu(2006/10/25 22:25:57)


言われてみるまで全く気が付きませんでした。
「常にではなく基本的に倍精度で計算する」と覚えておきます。
ご指摘ありがとうございました。


この投稿にコメントする

削除パスワード

No.6688

Re:小数点以下の表示について
投稿者---たかぎ(2006/10/25 22:47:30)
http://takagi.in/


>言われてみるまで全く気が付きませんでした。
>「常にではなく基本的に倍精度で計算する」と覚えておきます。
>ご指摘ありがとうございました。

実際には、浮動小数点定数の値、浮動小数点数をオペランドに持つ演算結果、浮動小数点型への型変換の結果は、実際に要求される型の範囲や精度より大きくても構わないことになっています。ただし、型が変わるわけではありません。

つまり、float型が32ビットで、double型が64ビットの環境の場合、float型が要求される文脈であっても64ビットで表現される可能性はありますが、それがdouble型というわけではなく、あくまでもfloat型です。
また、このように、要求以上に大きな表現範囲や精度を用いることは、原則でも何でもありません。

処理系がC99であれば、<float.h>で定義されるFLT_EVAL_METHODマクロの値を調べれば、どのように振る舞うかがわかります。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    記事検索    ログ    タグ一覧





掲示板提供:(有)リアル・インテグリティ