我正试图以定点格式缩放值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
类型的值或算术的情况下完成上述中的任何一项,这是可以做到的,但会困难得多。