функция modf не работает должным образом - PullRequest
0 голосов
/ 29 июня 2011

Я пытаюсь сохранить все цифры десятичного числа. Я решил использовать для этой цели 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

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

Я думаю, что вы не делаете все правильно, позвольте мне сказать, почему: scanf("%lf", &num1);.

Здесь вы уже преобразуете ввод в удвоение ... так что вы не получите это "высокоточное сканирование", которое вы пытаетесь, потому что оно теряется в этом первом преобразовании.

Если вам нужны действительные десятичные числа, вы должны найти . в строке ascii и преобразовать ее в и int там.

РЕДАКТИРОВАТЬ Я написал небольшую программу, вы это имели в виду?

#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 голосов
/ 29 июня 2011

Это потому, что числа с плавающей запятой не сохраняются точно (например, не совсем представимы). Вот пример, который вы можете использовать, чтобы проиллюстрировать это:

#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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...