如果不支持 double,如何使用 float 来达到相同的精度?

If double is not supported, how can I use float to achieve the same precision?

提问人:euraad 提问时间:12/17/2021 更新时间:12/17/2021 访问量:100

问:

我有一个代码,可以按照我的意愿做正确的事情。C

void create_weights(float alpha, float beta, float kappa, uint8_t L){

    /* Compute lambda and gamma parameters */
    double lambda = alpha * alpha * (L + kappa) - (double)L;

    /* Insert at first index */
    float Wm0 = lambda/(L + lambda);
    float Wc0 = Wm0 + 1 - alpha * alpha + beta;
    
    printf("Wm0 = %f, Wc0 = %f, lambda = %f\n", Wm0, Wc0, lambda);
    printf("Wci = 0.5f / (L + lambda) = %f\n",0.5f / (L + lambda));
}

int main() {
    
    create_weights(0.001, 2, 0, 3);

    return 0;
}

输出为

Wm0 = -999998.875000, Wc0 = -999995.875000, lambda = -2.999997
Wci = 0.5f / (L + lambda) = 166666.648140

在MATLAB中,输出为:

lambda = -2.999997000000000
Wm0 = -999999.0000082518 
Wc0 = -999996.0000092518
0.5 / (L + lambda) = 166666.6666680420

所以我离得很近!但问题来了。这条线

double lambda = alpha * alpha * (L + kappa) - (double)L;

正如你所看到的,我混合了 和 .这只是为了测试。doublefloat

如果我将该代码更改为

double lambda = alpha * alpha * (L + kappa) - L;

或者这个代码(现在它只是代码中的浮点数):

float lambda = alpha * alpha * (L + kappa) - L;

然后我会得到这个输出:

Wm0 = -967915.312500, Wc0 = -967912.312500, lambda = -2.999997
Wci = 0.5f / (L + lambda) = 161319.384615

所以在这种情况下,我需要这一行,但我不允许使用 double,因为我的处理器不支持 double。

double lambda = alpha * alpha * (L + kappa) - (double)L;

那么,如果我想像浮点一样使用双精度浮动精度,我该怎么办?

在此处运行代码:https://onlinegdb.com/dwwWtdf2S

C MATLAB 精度

评论

3赞 Eugene Sh. 12/17/2021
但我不允许使用 double,因为我的处理器不支持 double - 您的处理器不必支持 .如果 FPU 中不支持,则在软件中模拟。听起来你无论如何都想模拟它,所以让编译器为你做。doubledouble
1赞 Cris Luengo 12/17/2021
你想做,因为计算是从左到右的,参数将在混合算术运算中被提升。double lambda = (double)alpha * alpha * (L + kappa) - L;floatdouble
3赞 Eugene Sh. 12/17/2021
@MrYui 如果你不想使用 ,你将无法获得计算的精度。但这是你确实想要的。除非你想从头开始实现它,否则没有办法绕过它,我怀疑它会比标准更高性能。doubledouble
2赞 Eugene Sh. 12/17/2021
然后完全刮擦浮点并切换到定点
2赞 Eugene Sh. 12/17/2021
@0____ 但 100% 可移植,没有意外的性能损失或链接的 FP 库:P

答: 暂无答案