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

时间:2019-05-20 14:33:03

标签: c++ visual-c++ modulo fractions cmath

我最近遇到了一个问题,我在MSVC中遇到了段错误,而在GCC中却没有。

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

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

我不想/不在乎整个数字的地方。

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

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

有没有办法解决这个临时变量?

2 个答案:

答案 0 :(得分:4)

您可以编写一个简单的包装程序来完成此操作:

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));
}

这是最好的,因为它很清楚并且没有任何花招。

答案 1 :(得分:4)

如果以后不需要value,可以将其称为

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

如果您仍然需要原始值,则可以轻松地对其进行重构。

PS :我没有提到nullptr是有效参数。 MSVC可能会遭受破坏。

PS2::我不会为不必要的临时文件担心太多。我希望编译器会生成类似的代码,并且与传递value只是为了避免使用临时文件相比,显式地提到临时文件更加简洁和可读性强。