我最近遇到了一个问题,我在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);
有没有办法解决这个临时变量?
答案 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
只是为了避免使用临时文件相比,显式地提到临时文件更加简洁和可读性强。