double to_decimalIEEE754(char *str)
{
int n = strlen(str);
double exp = 0;
double significand = 0;
double sign = ((char)str[0] - '0') ? -1 : 1;
for (int i = 1, j = 11, k = 12, counter1 = 0, counter2 = 1; i < n; i++)
{
if (i >= 1 && i <= 11)
{
exp += ((char)str[j] - '0') * pow(2, counter1);
counter1++;
j--;
}
else
{
significand += ((char)str[k] - '0') * pow(2, -counter2);
counter2++, k++;
}
}
significand += 1;
return significand * sign * pow(2, exp - 1023);
}
...
// In the real code this is in main obviously
printf("Insert the number you want to convert: ");
scanf("%s", str);
double res = to_decimalIEEE754(str);
printf("%lf\n", res);
字符串
我使用64位IEEE转换,当我输入二进制时得到的结果是正确的,但当我打印它时它只有浮点精度,我不知道为什么。
2条答案
按热度按时间z2acfund1#
%f
说明符默认打印6位有效数字。如果你想打印更多,你需要添加一个精度说明符。此外,l
修饰符在打印时没有效果,因为float
不能传递给像printf
这样的可变参数函数。字符串
w8f9ii692#
printf("%lf\n", res);
以小数点后6位的 * 固定 * 精度打印。如果传入的参数是float
,double
或任何有限值,则会发生这种情况。l
是可选的。Typical
double
需要最多17个 * 有效**1十进制数字才能与其他double
区分开来。用途:
字符串
参见Printf width specifier to maintain precision of floating-point value