我有二进制形式的两个整数,num1
和num2
存储为包含“0”和“1”的字符串。
将num1
除以num2
以获得浮点double
结果的最佳算法是什么?
答案 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;
}