根据浮点符号舍入浮点的最简单方法是什么

时间:2019-06-20 21:00:04

标签: c++

我正在将SFML库用于具有移动对象的游戏应用程序。在游戏中,我有一个球对象,并且需要确保每次移动时该球在Y轴上的偏移量至少为0.1(或-0.1)

这是我现在使用的代码:

if (offset.y < 0.0 && offset.y > -0.1) offset.y = -0.1;
if (offset.y > 0.0 && offset.y < 0.1) offset.y = 0.1;

有没有更简单/更漂亮的方式来实现这一目标?

编辑: 如评论所指出,代码应包含0.0大小写

if (offset.y < 0.0 && offset.y > -0.1) offset.y = -0.1;
if (offset.y >= 0.0 && offset.y < 0.1) offset.y = 0.1;

4 个答案:

答案 0 :(得分:4)

只需使用std::abs()std::copysign()

if (std::abs(offset.y) < .1)
    offset.y = std::copysign(.1, offset.y);

以其他任何方式保存零符号都很困难。

但是,请考虑是否不能使用积分模型; .1不能完全表示为二进制浮点。

答案 1 :(得分:2)

恐怕“更容易或更漂亮”是基于意见的,但是您可以首先将逻辑包装到具有有意义名称的函数中(希望比我的更好)。

double at_least(double min_value, double x)
{
    if (x < 0.0 && x > -min_value)
        return -min_value;
    if (x >= 0.0 && x < min_value)
        return min_value;
    return x;
}

然后,您可以尝试其他一些替代方法:

#include <cmath>
#include <algorithm>

double at_least(double min_value, double x)
{
    return std::copysign(std::max(min_value, std::abs(x)), x);
}

或者这个

double at_least(double min_value, double x)
{
    if (x < 0.0 )
        return std::min(-min_value, x);
    else
        return std::max(min_value, x);
}

在测试每一项的正确性之后,如果性能对于您的任务很重要,您还可以对其进行概要分析。参见例如那些快速基准:

http://quick-bench.com/AXt8U9vKg-75XXOFMyCK0g14RyQ
http://quick-bench.com/_nfoT0BKsAvh6QDzAWc-cX3_KYU

答案 2 :(得分:1)

如果只需要小数点后一位,则可以使用小数位整数。要将其转换为浮点数,请将其乘以0.1。要将浮点数转换为整数,请将其乘以10并四舍五入为最接近的整数。

答案 3 :(得分:0)

我认为这已经足够了。看起来很清楚。 您可以使用cmath中的诸如abs,signbit之类的函数进行播放。或将其包装到新功能中-但是我看不到这样做的任何意义