C语言 小数浮点到定点的转换



我正试图以定点格式缩放值1e-4,但我很难获得准确的结果。我将非常感谢任何帮助…

Matlab:

fprintf('%10.16f|%10d|n',fi(1e-4,0,32),storedInteger(fi(1e-4,0,32)))

0.0001000000000033 | 3518437209|

我用的是C的定点表示法

uint32_t eps = 3518437209;

eps = (uint32_t)(eps / ((uint64_t)1 << 45));

与我对

的预期相反0.0001000000000033

eps值为

0

谢谢! !

在C中做到这一点的最简单的方法-我承认可能不符合您的要求-是这样的:

#include <stdio.h>
#include <inttypes.h>
int main()
{
double val = 1e-4;
uint32_t ival = val * 35184372088832. + 0.5;
printf("%un", ival);
}

这个神奇的缩放因子35184372088832.只是245,我添加0.5,使其舍入到最接近的定点值。这是一种显而易见的方法,对于"普通"用户来说效果很好。值,但它可能不太适合极端值,我甚至不确定它是否保证输入值大于1.22e-4的行为。

要将定点值转换回浮点值以便打印出来,只需执行相反的操作:

double val2 = ival / 35184372088832.;
printf("%.16fn", val2);

在我的机器上,这打印0.0001000000000033

如果您想在不使用double类型的值或算术的情况下完成上述中的任何一项,这是可以做到的,但会困难得多。