什么是组合多个y = mx + b方程的最有效方法?

时间:2015-07-18 12:38:03

标签: objective-c c math

我试图编写一些单位转换器代码,它基本上使用公式y = mx + b定义方程式(因此"规则"由乘数和加数组成)并将它们链接在一起在多个单位之间进行转换,而无需指定每个可能的转换组合(它使用路径查找算法来计算出来,但这不是此问题范围的一部分)。

无论如何,我已经以下列形式吐出了连续的结构:

typedef struct {
    double multiplier;
    double summand
} ConversionRule;

我想要做的是" compact"多个规则在一起。我可以有一组像这样的结构:

ConversionRule rule1 = { .multiplier = 2, .summand = 4 };
ConversionRule rule2 = { .multiplier = 4, .summand = 0 };
ConversionRule rule3 = { .multiplier = 3, .summand = 0 };
ConversionRule rule4 = { .multiplier = 1, .summand = 8 };

如果我正在转换数字" 2"使用规则1到4,然后我将查看以下方程组:

double input = 2;
input *= rule1.multiplier;
input += rule1.summand;
input *= rule2.multiplier;
input += rule2.summand;
input *= rule3.multiplier;
input += rule3.summand;
input *= rule4.multiplier;
input += rule4.summand;
printf("The answer is: %f\n", input);

在这个例子中,会打印104的结果。但是,我不想单独浏览每个连续的规则,因为有时候会有几百个它们和我真的想要保持任何不必要的数学。

我一直试图弄清楚如何将它们全部塞进一个规则中,然后只能将其应用于输入 ,但我不确定如何做到这一点(我可能不清楚我在寻找什么术语,如果有的话)。

最有效的方法是什么?

1 个答案:

答案 0 :(得分:1)

如果您希望构建一个能够按顺序应用两个规则的规则,您可以这样做:假设您有两个转换器

Ax+B
Cx+D

如果按顺序应用它们,结果将是

C(Ax+B)+D = CAx+CB+D

可以使用乘数CA和summand CB+D重写为单个规则。

ConversionRule combine(ConversionRule r1, ConversionRule r2) {
    ConversionRule res;
    res.multiplier = r1.multiplier*r2.multiplier;
    res.summand = r2.multiplier*r1.summand + r2.summand;
    return res;
}

您可以通过在循环中应用相同的逻辑来组合链中的多个规则。