C语言 Double函数返回浮点值

suzh9iv8  于 2023-11-17  发布在  其他
关注(0)|答案(2)|浏览(164)
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转换,当我输入二进制时得到的结果是正确的,但当我打印它时它只有浮点精度,我不知道为什么。

z2acfund

z2acfund1#

%f说明符默认打印6位有效数字。如果你想打印更多,你需要添加一个精度说明符。此外,l修饰符在打印时没有效果,因为float不能传递给像printf这样的可变参数函数。

printf("%.16f\n", res);

字符串

w8f9ii69

w8f9ii692#

printf("%lf\n", res);以小数点后6位的 * 固定 * 精度打印。如果传入的参数是floatdouble或任何有限值,则会发生这种情况。l是可选的。
Typical double需要最多17个 * 有效**1十进制数字才能与其他double区分开来。
用途:

printf("%.17g\n", res); // Assumes common double
printf("%.*g\n", DBL_DECIMAL_DIG, res); // Portable, uses exponential for large and tiny values
printf("%.*e\n", DBL_DECIMAL_DIG-1, res); // Portable, always uses exponential notation.
printf("%a\n", res); // Portable, yet in hex

字符串
参见Printf width specifier to maintain precision of floating-point value

  • 1significant 是第一个非零的小数位数,与小数点的位置无关。12345678901.234567和0.00012345678901234567都有17个 significant 小数位。

相关问题