如何避免在 std::modf 中使用临时变量?

How to avoid using temporary variable with std::modf?

我最近 运行 遇到了一个问题,我在 MSVC 中遇到了段错误,而在 GCC 中却不会。

几小时后我意识到我的 MSVC 版本显然不支持以下语法:

double value = 3.4;
double fractional = std::modf(value, nullptr);

我不 want/care 整个数字部分。

是的,我知道我可以做“3.4 - 3.0”之类的,但我担心以这种方式专门使用 modf。目前我只能通过以下方式看到这样做:

double temp; 
double value = 3.4;
double fractional = std::modf(value, &temp);

有没有办法绕过这个临时变量?

您可以编写一个简单的包装器来执行此操作:

double frac(double value)
{
    double temp;
    return std::modf(value, &temp);
}

这样编译器可能会优化 temp

编辑:这也可以与@formerlyknownas_463035818的想法相结合而不会丢失value:

double frac(double value)
{
    return std::modf(value, &value);
}

或者更好,@NathanOliver 的评论(编辑感谢@Evg 的评论):

double frac(double value)
{
    int sign = value >= 0 ? 1 : -1;
    double avalue = std::abs(value)
    return std::isinf(value) ? 0.0 : sign * (avalue - std::floor(avalue));
}

这个最好,因为它很清楚,不涉及任何技巧。

如果你以后不需要value,你可以称它为

double value = 3.4;
double fractional = std::modf(value, &value);

如果你还需要原始值,你可以很容易地重建它。

PS:我没有发现 nullptr 是有效参数的任何提及。也许 MSVC 的破坏是正确的。

PS2:我不会太担心不必要的临时。我希望编译器生成类似的代码,并明确提及临时文件比传递 value 只是为了避免临时文件更清晰、更具可读性。