2013-01-02 3 views
1

double을 BCD로 변환하는 함수를 작성했습니다. (BCD : double의 각 자릿수를 unsigned char로 저장하고 전체 길이, 소수 길이 (부동 소수점 뒤에있는 부분) 및 이중 숫자의 부호). 나는 다음과 같은 구조체BCD 산술 연산

struct bcd_number 
{ 
unsigned int length; 
unsigned int fractional; 
signed char sign; 
unsigned char *digits; 
}; 

를 사용하여 BCD 함수에 두 번 먹으 렴 : 완벽하게 작동

struct bcd_number* double2bcd(double x) 
{ 
    char tmp[512]; 
    struct bcd_number* bcd = malloc (sizeof(struct bcd_number)); 

    int a = x; 
    double before = a; 
    double fractional; 
    fractional = x-(long)x; 


    bcd->digits = malloc (512); 

    char* z = (char*) bcd->digits; 


    sprintf (tmp,"%g",fabs(before)); 

    bcd->length = strlen(tmp); 
    bcd->sign = (before < 0) ? '-' : '+'; 

    for (size_t i=0; i<bcd->length; ++i) 
    { *z++ = tmp[i] - '0'; } 

    sprintf (tmp,"%g",fabs(fractional)); 

    for (size_t i = strlen(tmp)-1; i!=0; --i) 
    if (tmp[i] != '0') 
    { tmp[i+1] = 0; break; } 


    bcd->fractional = strlen(tmp+2); 
    bcd->length += bcd->fractional; 


    for (char* t = tmp + 2; *t; *z++ = *t++ - '0'); 
     bcd->digits = realloc (bcd->digits, bcd->length); 



    return bcd; 
} 

합니다.

그리고 덧셈/뺄셈 (완전한 소스 코드 : http://pastebin.com/HR70VukM)을 수행 할 수있는 능력을 추가했지만 이제는 곱셈과 나눗셈을 수행하려고합니다. 그러나 문제는 숫자로만 문자가 있다는 것입니다 (나는 그 문자를 변경하고 싶지 않습니다). 이제는 '종이에 곱셈'(계산기가없는 고전적인 방식)과 같아야하지만, 모듈러스 연산자를 추가해야한다는 생각이 들었습니다. 반면에 나는 modulo로 chars로 구현하는 방법을 모른다. 어떤 아이디어 또는 힌트?

+0

정말로 처음'malloc()'을 제거해야합니다. 함수에서 임시 버퍼로 변환 한 다음 올바른 크기를 알면'malloc()'을 호출하여'realloc()'을 제거하십시오. 더 나아가 최대 정적 크기를 결정하고 길이를 저장하기 때문에 항상이를 사용하십시오. 많은 작은 (10-30 바이트) 할당은 관리 비용이 많이 들고 비효율적 일 수 있습니다. – unwind

+0

구체적인 질문이 무엇인지는 명확하지 않습니다. "어떻게 [장시간 곱셈을 수행합니까 (http://en.wikipedia.org/wiki/Long_multiplication#Long_multiplication) 10 진수로 수행합니까?"라고 묻는다면, 그 답은 "당신이 손으로 똑같이 할 것" . –

+0

좋아요. 곱셈을 수행하는 함수 (예 : struct bcd_number * multiplication (struct bcd_number * a, struct bcd_number * b))를 작성하고 싶습니다.하지만 구현에 문제가 있습니다. – Kossi

답변

0

곱셈 및 나눗셈은 무엇입니까? 계승? 모듈러스? 멱지수? 자연 대수? 사인? 코사인? BCD를 다시 double로 바꾸고, 수학 연산을 수행하고, 결과를 BCD로 바꿉니다.

0

BCD에 대해 알고 싶었던 모든 것은 General Decimal Arithmetic 웹 사이트에서 찾을 수 있습니다.

곱셈의 경우 두 자리수를 곱하여 두 자리 결과를내는 기본 루틴이 필요합니다. 이 중간 결과를 답안의 적절한 위치에 추가하십시오. 이 "적절한 위치"를 찾는 것은 "곱셈 테이블"을 갖는 것 외에 "손으로 직접 할 수있는 것과 똑같은"방법의 핵심입니다.