我刚编写了以下C ++代码,以便将小数转换为相应的二进制格式。
double get_decimal_part(double num) {
long x = static_cast<long>(num);
return (num - static_cast<double>(x));
}
long get_real_part(double num) {
return static_cast<long>(num);
}
string fraction_to_binary(double num) {
string decimal_binary = "";
double decimal_part = get_decimal_part(num);
while ( decimal_part > 0 ) {
double temp = decimal_part * 2;
if ( get_real_part(temp) == 0 ) decimal_binary += "0";
else decimal_binary += "1";
decimal_part = get_decimal_part(temp);
}
return decimal_binary;
}
int main() {
cout << "3.50 - " << fraction_to_binary(3.50) << endl;
cout << "3.14 - " << fraction_to_binary(3.14) << endl;
}
输出结果为: -
3.50 - 1
3.14 - 001000111101011100001010001111010111000010100011111
我对此有以下问题: -
[编辑] 我也尝试使用以下命令将float转换为字符串,但它也没有帮助。
stringstream ss;
ss << my_float;
cout << string(ss.str()) << endl;
答案 0 :(得分:3)
在回答您的具体问题之前,有什么问题
modf
为此?
关于您的具体问题:
什么跟踪"0"
?你在谈论一个文本
代表在这里。在计算机内"3.5"
和"3.50"
对应于相同的数字,并具有相同的表示。
有一个库函数可以返回a的精度
浮点数:std::numeric_limits<double>::digits
(除了它不是一个函数,而是一个常数)。但如果你
想要将一个数字分解为整数和整数
零件,modf
完全符合要求。与你的代码不同,将会
实际工作,适用于double
的所有值。
仔细观察你想要的更大的图片
do:我的方法是使用frexp
来提取基数2
指数,然后ldexp
将数字缩放到范围内
[0.5...1)
然后循环std::numeric_limits<double>::digits
时间,每次乘以2
,并检查:如果
乘法的结果小于1,然后插入0
数字;否则,插入1位数并减1
如果机器,所有上述操作都是准确的
浮点数为2,或2的幂。)