分为两个任意精度的二进制整数

时间:2017-12-30 20:53:13

标签: c arbitrary-precision

我有二进制形式的两个整数,num1num2存储为包含“0”和“1”的字符串。

num1除以num2以获得浮点double结果的最佳算法是什么?

3 个答案:

答案 0 :(得分:1)

假设您的字符串采用big-endian二进制格式,这是将二进制数表示为字符串的最自然方式,以下是将每个str转换为双val的方法:

double val = 0.0;
while (0 != *str) {
    val *= 2.0;
    if ('1' == *str) val += 1.0;
    str++;
}

然后划分双打。

答案 1 :(得分:0)

#include<iostream>
#include<cmath>
int stringToNum(std::string str){
  int num=0;
  for(size_t i=0;i<str.size();i++){
    if(str[i]=='1'){num+=pow(2,str.size()-i-1);}
  }
 return num;
}

int main(){
   std::string str1,str2;
   std::cin>>str1>>str2;
   int num1 = stringToNum(str1);
   int num2 = stringToNum(str2);
   std::cout << (float)num1/num2 << '\n';
}

答案 2 :(得分:0)

代码可以遵循小学数学。

Align the dividend and divisor.  
Loop DOUBLE_BITS times  
  Test divisor and dividend  
  If big enough, subtract and add to quotient   
  Shift  

下面是未经测试的代码,因此将OP视为伪代码的解决方案。

double str_div(const char * num1, const char *num2) {
  while (*num1 == '0') num1++;  // find ms bit
  while (*num2 == '0') num2++;
  if (*num2 == '\0') {
    if (*num1) return 1.0/0.0;
    return 0.0/0.0; 
  }
  size_t sz1 = strlen(num1) + 1;
  size_t sz2 = strlen(num2) + 1;
  double m = pow(2, 1.0* sz1 - sz2);
  #define DOUBLE_BITS 53
  size_t szmx = max(sz1, sz2); 
  size_t sza = szmx  + DOUBLE_BITS + 1;

  // form working register `a`
  char *a = malloc(sza);
  memset(a, '0', sza);
  memcpy(a, num1, sz1 - 1);
  a[sz1 - 1] = '\0';
  double quotient = 0.0;
  for (size_t i=0; i<DOUBLE_BITS; i++) {
    if (str_ge(a, num2)) {  // a >= num2?
      str_sub(a, num2);     // a -= num2
      quotient += m; 
    }
    m /= 2.0;
  }
  free(a);
  return quotient;
}