[英]Convert floating number to binary representation program in C
#include "ieee754.h"
#include <stdio.h>
#include <math.h>
//This program convert a floating number to its binary representation (IEEE754) in computer memory
int main() {
long double f, binaryTotal, binaryFrac = 0.0, frac, fracFractor = 0.1;
long int integer, binaryInt = 0;
long int p = 0, rem, temp;
printf("\nEnter floating number: ");
scanf("%Lf", &f);
//separate the integer part from the input floating number
integer = (int)f;
//separate the fractional part from the input floating number
frac = f - integer;
//loop to convert integer part to binary
while (integer != 0) {
rem = integer % 2;
binaryInt = binaryInt + rem *pow(10, p);
integer = integer / 2;
p++;
}
//loop to convert fractional part to binary
while (frac != 0) {
frac = frac * 2;
temp = frac;
binaryFrac = binaryFrac + fracFractor * temp;
if (temp == 1)
frac = frac - temp;
fracFractor = fracFractor / 10;
}
binaryTotal = binaryInt + binaryFrac;
printf("binary equivalent = %Lf\n", binaryTotal);
}
我正在尝试将浮点数转换为二进制表示(64 位)。 此代码有效但并不完美。 例如,当我转换.575
它给了我0.100100
但是当我做使用本网站的转化http://www.exploringbinary.com/floating-point-converter/ ,正确的输出应该是0.1001001100110011001100110011001100110011001100110011
我无法理解是什么让我的代码截断了数字。 谁能帮我解决这个问题? 我感谢您的帮助。
很多问题:
使用(int)
提取long double
的整数部分严重限制了范围。 使用modfl(long double value, long double *iptr);
long double f; long int integer; //separate the integer part from the input floating number // Weak code integer = (int)f; long double ipart; long double fpart = modfl(f, &ipart);
long p; pow(10,p);
--> pow()
返回值的精度损失,一旦p
超过某个值,(示例 25)。 将pow()
与采用long double
的函数一起使用也很奇怪。 我希望powl()
。
其他各种不精确的 FP 问题: fracFractor/10
, long
精度有限。
代码很奇怪,因为它试图将 FP 数(可能是某种二进制格式)转换为二进制表示。 它不应该在代码中的任何地方要求10
。
建议一些简单的东西
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<float.h>
static void print_ipart(long double x) {
int digit = (int) (modfl(x/2, &x)*2.0) + '0';
if (x) {
print_ipart(x);
}
putchar(digit);
}
void print_bin(long double x) {
// Some TBD code
// Handle NAN with isnan()
// Handle infinity with isfinite()
putchar(signbit(x) ? '-' : '+');
long double ipart;
long double fpart = modfl(fabsl(x), &ipart);
print_ipart(ipart);
putchar('.');
while (fpart) {
long double ipart;
fpart = modfl(fpart * 2, &ipart);
putchar((int)ipart + '0');
}
putchar('\n');
}
int main() {
print_bin(-4.25);
print_bin(.575);
print_bin(DBL_MAX);
print_bin(DBL_MIN);
print_bin(DBL_TRUE_MIN);
}
输出
-100.01
+0.1001001100110011001100110011001100110011001100110011001100110011
+1111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.
+0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
+0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
这就是为什么这不太可能奏效的原因:
fracFractor = 0.1
...
fracFractor = fracFractor/10
0.1 无法以任何二进制浮点格式准确表示。 您不能将 0.1 表示为 2 的负幂的倍数。 将其除以 10 将使其在每一步都收集舍入误差。 可能是因为您最终将一个重复分数与另一个重复分数进行了比较,因此您实际上退出了这个循环。
这将严重限制您可以实现的目标:
binaryTotal = binaryInt + binaryFrac;
在浮点中执行此操作将有严重的限制 - 至少表示 0.1 不能表示如上所述。 这就是为什么您得到的答案显示为二进制和十进制数字的混合。
要解决这个问题,您可能应该查看数字的各个位。 为了保持您的解决方案的整体思路完整,最简单的方法是不断从您的分数中减去 2 的负幂(0.5、0.25 等),测试它是否仍然为正,并基于此构建一个字符串。 然后对整数部分使用类似的逻辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.