ショッピングモール  


【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板1こちら


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

No.2739

if文の判定結果
投稿者---スマイル(2004/10/04 14:29:45)


以下のような四捨五入のプログラムを作成したのですが、
うまく期待通りの答えが返ってきません。
どうも,良分の条件式の判定がうまくいってないようなのですが・・

#include <stdio.h>

double sisya(double number,int keta){
    double num_dec;
    int num_int,i;
    
    num_dec = number;
    for(i=0;i<keta;i++){
        num_dec = num_dec * 10.0;
    }
    num_int = (int)num_dec;
    num_dec = (num_dec - num_int) * 10.0;printf("sono1=<%f>\n",num_dec);
    
    if(num_dec>=5.0)num_int++;        /*    ------------------------------------*/
    
    num_dec = num_int;
    
    for(i=0;i<keta;i++){
        num_dec = num_dec / 10;
    }
    return num_dec;   
}   
main(){
    double number;
    
    printf("Type of number\n");
    scanf("%lf",&number);
    number = sisya(number,2);
    printf("sisyagonyu<%lf>",number);
}


例えばnumber=20.365とし、
期待する返り値は20.37なのですが、
結果は20.36となります。
,if文でnum_decが5未満と判定されてしまっているようです・・・
ちなみにnumber=20.3654とすると
期待通り20.37が返ってきます。
なぜなのでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:if文の判定結果 2740 REE 2004/10/04 15:27:28


No.2740

Re:if文の判定結果
投稿者---REE(2004/10/04 15:27:28)


浮動小数の誤差が原因です。

>例えばnumber=20.365とし、
>期待する返り値は20.37なのですが、
>結果は20.36となります。

20.365が内部的に20.3649999999999の様に保持されているか、
10倍する過程で、似たような値を経由していると思われます。



この投稿にコメントする

削除パスワード

No.2741

Re:if文の判定結果
投稿者---スマイル(2004/10/04 15:34:51)


>20.365が内部的に20.3649999999999の様に保持されているか、
>10倍する過程で、似たような値を経由していると思われます。

これはバグなのでしょうか?
だとするとどのように解消すればよいでしょうか?



この投稿にコメントする

削除パスワード

No.2742

Re:if文の判定結果
投稿者---スマイル(2004/10/04 15:47:17)


>>20.365が内部的に20.3649999999999の様に保持されているか、
>>10倍する過程で、似たような値を経由していると思われます。

試しに小数点を20桁まで表示させてみると
5.0ではなく
<4.99999999999772630000>
と表示されてしまいました。




この投稿にコメントする

削除パスワード

No.2744

Re:if文の判定結果
投稿者---REE(2004/10/04 17:22:00)


>これはバグなのでしょうか?

バグではなく、仕様です。
浮動小数というのはそういうものなのです。

>だとするとどのように解消すればよいでしょうか?

必要な精度よりも、小さい値で下駄をはかせるのが手っ取り早そうです。
例えば5と比較する前に0.00000001を足しておくなど




この投稿にコメントする

削除パスワード

No.2745

Re:if文の判定結果
投稿者---スマイル(2004/10/04 17:25:51)


>必要な精度よりも、小さい値で下駄をはかせるのが手っ取り早そうです。
>例えば5と比較する前に0.00000001を足しておくなど

そうですか やはりそういう方法をとるしかないのですね。
仕様とはちょっとびっくりでした。
ご回答どうもありがとうございました。




この投稿にコメントする

削除パスワード

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




掲示板提供:Real Integrity