如何使涉及浮点函数的表达式成为编译时常量?

Rix*_*ugh 4 c++ arrays variables

我有一个常量整数,steps,它是使用其他两个常量变量的商的下限函数计算的。但是,当我尝试使用它作为数组的长度时,Visual Studio 告诉我它必须是一个常量值,并且当前值不能用作常量。如何使其成为可用作数组长度的“真实”常量?楼层功能是否有问题?我可以使用其他替代方案吗?

const int simlength = 3.154*pow(10,7);
const float timestep = 100;
const int steps = floor(simlength / timestep);

struct body bodies[bcount];

struct body {
    string name;
    double mass;
    double position[2];
    double velocity[2];
    double radius;
    double trace[2][steps];
};
Run Code Online (Sandbox Code Playgroud)

use*_*522 8

std::pow标准库的和函数是不可能的std::floor,因为它们没有constexpr- 限定。

您也许可以替换为标记为 的std::pow手写实现。由于您只是想获取整数的幂,所以这应该不会太难。如果您仅使用 10 的幂,浮点文字也可以用科学记数法编写,例如,这使得调用变得不必要。my_powconstexpr1e7pow

floor不需要调用,因为/float转换double已经int隐式进行了地板处理。或者更正确地说,它截断,这对于正非负值相当于下限。

然后,您还应该将变量声明中的 替换为constwith constexpr,以确保变量可在常量表达式中使用:

constexpr int simlength = 3.154*my_pow(10,7); // or `3.154e7`
constexpr float timestep = 100;
constexpr int steps = simlength / timestep;
Run Code Online (Sandbox Code Playgroud)

理论上只float需要进行此更改,因为整型有一个特殊的例外const,但这种方式似乎更一致。

另外,我感觉你的变量类型有问题。长度和步长不应由浮点运算和类型决定,而应仅由整数类型和运算决定。浮点运算并不精确,并且会相对于实数的数学精确计算引入误差。这样很容易出现意想不到的差一或更严重的错误。