2011-06-29 10 views
0

10進数のすべての桁を格納しようとしています。この目的でmodfを使用することにしました。modf関数が正常に動作しません

struct high_precision scan_high(int *j) 
{ 
    int i,a; 
    struct high_precision mynum; 
    double num1, fracpart, intpart; 
    printf("Enter the values> "); 
    scanf("%lf", &num1); 
    if(num1 < 0) 
     mynum.sign = -1; 
    else 
     mynum.sign = 1; 
    num1 = fabs(num1); 
    fracpart = modf(num1, &intpart); 
    if (intpart > 0 && intpart < 10) 
     a = 1; 
    while(intpart == 0) { 
     fracpart *= 10; 
     fracpart = modf(fracpart, &intpart); 
     a -= 1; 
    } 
    for(i=0;fracpart > 0 && intpart != 0;i++){ 
     if(intpart > 0){ 
      mynum.digits[i] = intpart; 
     } 
     fracpart *= 10; 
     fracpart = modf(fracpart, &intpart); 
    } 
    *j = i; 
    mynum.decpt = a; 

    return(mynum); 
} 

しかし、何とか私が望むように動作しません。

Enter the values> 0.009876 
    0.876000 9.000000 
    0.760000 8.000000 
    0.600000 7.000000 

この行で停止する必要があります。カウントは継続しています。

1.000000 5.000000 
1.000000 9.000000 
1.000000 9.000000 
1.000000 9.000000 
1.000000 9.000000 
1.000000 9.000000 
0.999998 9.000000 
0.999977 9.000000 
0.999767 9.000000 
0.997669 9.000000 
0.976694 9.000000 
0.766942 9.000000 
0.669420 7.000000 
0.694198 6.000000 
0.941983 6.000000 
0.419827 9.000000 
0.198267 4.000000 
0.982671 1.000000 
0.826707 9.000000 
0.267069 8.000000 
0.000000 2.000000 
0.000000 0.000000 
+4

[すべてのコンピュータ科学者が知っておくべきことについて浮動小数点演算](http://download.oracle.com/docs/cd/E19957-01/806-3568//cn_goldberg.html) – pmg

+0

[Wikipedia:浮動小数点数](http://en.wikipedia.org/wiki/Floating_point_number) –

答えて

0

これは浮動小数点数が正確には格納されていないためです(たとえば、正確に表現できないなど)。ここでは、これを説明するのに使用できる例です。

#include <stdio.h> 

int main() { 
    double x = 0.009876; 
    printf("%.20lf\n",x); 
    return 0; 
} 

---------- Capture Output ---------- 
> "c:\windows\system32\cmd.exe" /c c:\temp\temp.exe 
0.00987599999999999940 

> Terminated with exit code 0. 
0

私はあなたが適切なことをやっていないと思いますが、なぜ私は言わせて:scanf("%lf", &num1);

ここで既に入力をdoubleに変換しています...この最初の変換で「失われている」ため、この「高精度のスキャン」を取得できません。

実際の10進数が必要な場合は、ASCII文字列に.があり、それをintに変換する必要があります。

EDIT私は小さなプログラムをコーディングしましたが、これはあなたが気にしていたものですか?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int split_decimal(const char * in, int * intpart, unsigned int * decimals) { 

    char * dot = strchr(in, '.'); 

    if (!dot) { 
     *intpart = atoi(in); 
     *decimals = 0; 
     return 0; 
    } 

    *decimals = atoi(dot+1); 
    *intpart = atoi(in); 

    return 0; 
} 

int main(int argc, char ** argv) { 

    int intpart; 
    unsigned int decimals; 

    split_decimal("-1.337", &intpart, &decimals); 
    printf("%d.%d\n", intpart, decimals); 
    split_decimal("50", &intpart, &decimals); 
    printf("%d.%d\n", intpart, decimals); 

    return 0; 
} 

出力:

-1.337 
50.0 
+0

すべての小数点を配列(サイズ20)に数えたいとします。例えば 8.127 myhigh .digit = "8"、 "1"、 "2"、 "7" – mustafaSarialp

+1

文字列に '.'を単に削除してすべての数字を保存したいのですか? –