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로 구현하는 방법을 모른다. 어떤 아이디어 또는 힌트?
정말로 처음'malloc()'을 제거해야합니다. 함수에서 임시 버퍼로 변환 한 다음 올바른 크기를 알면'malloc()'을 호출하여'realloc()'을 제거하십시오. 더 나아가 최대 정적 크기를 결정하고 길이를 저장하기 때문에 항상이를 사용하십시오. 많은 작은 (10-30 바이트) 할당은 관리 비용이 많이 들고 비효율적 일 수 있습니다. – unwind
구체적인 질문이 무엇인지는 명확하지 않습니다. "어떻게 [장시간 곱셈을 수행합니까 (http://en.wikipedia.org/wiki/Long_multiplication#Long_multiplication) 10 진수로 수행합니까?"라고 묻는다면, 그 답은 "당신이 손으로 똑같이 할 것" . –
좋아요. 곱셈을 수행하는 함수 (예 : struct bcd_number * multiplication (struct bcd_number * a, struct bcd_number * b))를 작성하고 싶습니다.하지만 구현에 문제가 있습니다. – Kossi