如何避免在 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
只是为了避免临时文件更清晰、更具可读性。
我最近 运行 遇到了一个问题,我在 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
只是为了避免临时文件更清晰、更具可读性。