【发布时间】:2016-04-26 09:00:17
【问题描述】:
我想通过[0.01..1.2] 范围内的因子对int64_t 执行校正,精度约为0.01。天真的实现是:
int64_t apply_correction(int64_t y, float32_t factor)
{
return y * factor;
}
不幸的是,如果我将factor 转换为int32 或将y 转换为float,我将失去精度。
但是,如果我可以确保y 的最大值低于1<<56,我可以使用这个技巧:
(1<<8) * (y / (int32_t)(factor * (1<<8)))
如果我的输入值可以大于1<<56,我该如何解决这个问题?
情节转折:
我在 32 位架构上运行,其中 int64_t 是一种模拟类型,并且我不支持双精度。该架构是 Analog Devices 的 SHARC。
【问题讨论】:
-
y * (int_64t)factor;有什么问题? -
@luk32 因为
factor在 0.01-1.2 范围内,所以它不起作用。 -
如果你不支持双精度,你可以为此编写一个库,或者只是使用大量的双精度/多精度库。但是使用 double 仍然对您没有帮助,因为它只有 53 位精度,因此您无法获得完整的 64 位精度
-
@fluter 哦,我将
int64误读为float64,完全不明白问题出在哪里。我什至心不在焉地重新输入int思考abotu float。我想对我来说,即使是基本的大脑活动也为时过早。
标签: c integer-division single-precision