【发布时间】:2017-02-26 01:38:47
【问题描述】:
#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
我无法理解是什么让我的代码截断了数字。谁能帮我解决它?我感谢您的帮助。
【问题讨论】:
-
编译时启用所有警告。
-
@MichaelWalz 没有警告:ideone.com/aIShip
-
@mike 你应该在
.之后写下你想要多少位数:"%.20Lf"将打印0.10010011001100110011。 -
@mike mch 是对的,我的评论在这里并不重要。
-
那是因为数字不能完全用二进制(或
double)表示。所以它只能打印最近的数字,可以保存在long double中。您应该将您的号码保存到一个字符串中。
标签: c floating-point binary converters