分离浮点数和分数
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 它将是 2
和 0.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));
}
2.24213798933e-36
是 0.00000000000000000000000000000000224213798933
(可能相差一两个零,但您应该明白了)。数值的整数部分为0
,小数部分为有效0
,将“有效0
”乘以1000.0
给你留下“有效 0
”。
您正在获得完全预期的结果。仅仅因为你有一个非零的前导数字并不意味着该值的整数部分不是 0
,它只是意味着你有一个 标准化 值(即,写成小数点左边有一个非零数字)。 1.23e-3
是 0.00123
的规范化形式 - 您的代码将 return 0
和 1.23
.
我试图将浮点数分成积分部分和分形部分。我的方法适用于某些值,但当我遇到具有较长小数表示法的值时则无效。
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 它将是 2
和 0.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));
}
2.24213798933e-36
是 0.00000000000000000000000000000000224213798933
(可能相差一两个零,但您应该明白了)。数值的整数部分为0
,小数部分为有效0
,将“有效0
”乘以1000.0
给你留下“有效 0
”。
您正在获得完全预期的结果。仅仅因为你有一个非零的前导数字并不意味着该值的整数部分不是 0
,它只是意味着你有一个 标准化 值(即,写成小数点左边有一个非零数字)。 1.23e-3
是 0.00123
的规范化形式 - 您的代码将 return 0
和 1.23
.