Under/over 求和 int 乘以 double 时的近似值
Under/over approximation while summing int multiplied by double
我的代码也应该通过微分方程离散化的方法来评估系统的演化,但它需要修改的所有数据都是整数,总和需要是常数。问题就出在这里,他们的总和减少了。我该如何尝试解决这个问题?
mystruct Population {
int T;
int S;
int R;
int I;
};
std::vector<Population> result{p0_};
int repetitions = 20 ;
double gamma = 0.01 ;
double beta = 0.02 ;
for (int i = 1; i < repetitions; ++i) {
auto const& prev = result.back();
mystruct p;
p.S = prev.S - (prev.I * prev.S) * beta;
p.I = prev.I + (prev.I * prev.S) * beta -
prev.I * gamma;
p.R = prev.R + prev.I * gamma;
result.push_back(p);
}
这是方程式。
这些是输出的几个例子,其中 T 应该是 50
S = 47; I = 3; R = 0; T = 50
S = 43; I = 5; R = 0; T = 48
这很简单。 float/double 的乘法自动将整数转换为浮点类型。将浮点类型转换为整数存在舍入错误:向零舍入是默认行为。
如果您只想确保在处理整数时总和保持不变,只需确保您 add/subtract 的数字是整数且一致。
mystruct p;
int tmpInt1 = (prev.I * prev.S) * par_.beta;
int tmpInt2 = prev.I * par_.gamma;
p.S = prev.S - tmpInt1;
p.I = prev.I + tmpInt1 -tmpInt2;
p.rec = prev.R + tmpInt2;
您可能还更喜欢在 double/float 之前使用 round()
进行 int 转换。
编辑:另外,.R
和 .rec
之间有什么区别?您可能忘记了一个成员变量。
我的代码也应该通过微分方程离散化的方法来评估系统的演化,但它需要修改的所有数据都是整数,总和需要是常数。问题就出在这里,他们的总和减少了。我该如何尝试解决这个问题?
mystruct Population {
int T;
int S;
int R;
int I;
};
std::vector<Population> result{p0_};
int repetitions = 20 ;
double gamma = 0.01 ;
double beta = 0.02 ;
for (int i = 1; i < repetitions; ++i) {
auto const& prev = result.back();
mystruct p;
p.S = prev.S - (prev.I * prev.S) * beta;
p.I = prev.I + (prev.I * prev.S) * beta -
prev.I * gamma;
p.R = prev.R + prev.I * gamma;
result.push_back(p);
}
这是方程式。
这些是输出的几个例子,其中 T 应该是 50
S = 47; I = 3; R = 0; T = 50
S = 43; I = 5; R = 0; T = 48
这很简单。 float/double 的乘法自动将整数转换为浮点类型。将浮点类型转换为整数存在舍入错误:向零舍入是默认行为。
如果您只想确保在处理整数时总和保持不变,只需确保您 add/subtract 的数字是整数且一致。
mystruct p;
int tmpInt1 = (prev.I * prev.S) * par_.beta;
int tmpInt2 = prev.I * par_.gamma;
p.S = prev.S - tmpInt1;
p.I = prev.I + tmpInt1 -tmpInt2;
p.rec = prev.R + tmpInt2;
您可能还更喜欢在 double/float 之前使用 round()
进行 int 转换。
编辑:另外,.R
和 .rec
之间有什么区别?您可能忘记了一个成员变量。