分离浮点数和分数

Separating float integral and fractional

我试图将浮点数分成积分部分和分形部分。我的方法适用于某些值,但当我遇到具有较长小数表示法的值时则无效。

fractalValue = modf(value, &z);
l_integral = z;
l_fractal = fractalValue * 1000.0;

例如,当我的值 = 13.1800 时,这工作正常。

但是当值 = 2.24213798933e-36 时程序失败。 在本例中,modf 函数 returns 2.24213798933e-36 fractalValue 变量,以及 0 到 z.

您想从指数显示表格中获取部分,因此对于 2.435343454e36 它将是 20.435343454

如果是,玩具需要“规范化”您的号码(删除 e 部分)。然后你可以使用你的公式来得到数字部分

double remove_e(double val)
{
    int sign = val < 0 ? -1 : 1;
    if(val != 0.0)
    {
        val *= sign;
        double logten = log10(val);
        val /= pow(10, ceil(logten)-1);
    }
    return sign * val;
}

int main(void)
{
    double x = 2.34546465;

    printf("%e -> %f\n", x, remove_e(x));
    x = 0.0;
    printf("%e -> %f\n", x, remove_e(x));
    x = 2.34546465e-36;
    printf("%e -> %f\n", x, remove_e(x));
    x = 2.34546465e36;
    printf("%e -> %f\n", x, remove_e(x));
    x = -0.0;
    printf("%e -> %f\n", x, remove_e(x));
    x = -2.34546465e-36;
    printf("%e -> %f\n", x, remove_e(x));
    x = -2.34546465e36;
    printf("%e -> %f\n", x, remove_e(x));
}

https://godbolt.org/z/MevdfP

2.24213798933e-360.00000000000000000000000000000000224213798933(可能相差一两个零,但您应该明白了)。数值的整数部分为0,小数部分为有效0,将“有效0”乘以1000.0 给你留下“有效 0”。

您正在获得完全预期的结果。仅仅因为你有一个非零的前导数字并不意味着该值的整数部分不是 0,它只是意味着你有一个 标准化 值(即,写成小数点左边有一个非零数字)。 1.23e-30.00123 的规范化形式 - 您的代码将 return 01.23.