C++ 将一个浮点数除以它本身会产生非常大的整数

C++ 将一个浮点数除以它本身会产生非常大的整数,c++,math,sfml,C++,Math,Sfml,所以我有一个在我看来很奇怪的问题。我有一个粗糙的系统,可以在二维平面上对物体施加力,而最简单的计算似乎会导致我的一个变量溢出。我有以下几行: int-ySign=m_-Momentum.y/abs(m_-Momentum.y) 其中动量有两个数据成员,xy(m_动量是一个SFML sf::Vector2浮点数)。现在,通常公式应该总是返回1或-1,这取决于动量.y的符号(除非我大错特错) 然而,它偶尔会返回非常高的数字,如-2147483648。在该特定情况下,m_Momentum.y的值为0.

所以我有一个在我看来很奇怪的问题。我有一个粗糙的系统,可以在二维平面上对物体施加力,而最简单的计算似乎会导致我的一个变量溢出。我有以下几行:

int-ySign=m_-Momentum.y/abs(m_-Momentum.y)

其中动量有两个数据成员,
x
y
(m_动量是一个SFML sf::Vector2浮点数)。现在,通常公式应该总是返回1或-1,这取决于动量.y的符号(除非我大错特错)

然而,它偶尔会返回非常高的数字,如-2147483648。在该特定情况下,m_Momentum.y的值为0.712165(两个值均通过发送到std::cout获得);我又试了一次,m_动量。y是-0.578988,ySign仍然是-2147483648。有一个对应的xSign有时也会翻转,通常具有相同的最终值。我不能百分之百地确认这就是结果,但目前似乎是这样

我有点困惑为什么会发生这种情况,当它发生时,它基本上会使我的程序失效(它会立即向错误的方向发送数百万像素的对象)。从逻辑上讲,上面的这一行似乎不可能返回如此奇怪的结果

下面是我正在处理的函数。这可能是错误的做法,但我没想到会出现如此严重的错误。它产生的打印结果显示,在标志打印出来之前,所有数字看起来都正常;其中一个总是巨大的,然后你会看到像-2.727e+008这样的数字(据我所知,这是科学符号-2.727*10^8)

///修改动量
//如有必要,请重置
如果(重置==真)
{
m_动量x=0;
m_动量,y=0;
}
sf::矢量2 OldMoment=m_动量;
//对新的动量施加力。
m_动量.x+=力.x;
m_动量.y+=力.y;
sf::矢量2新矩=m_动量;
//计算总动量。
float sqmomentary=m_momentary.x*m_momentary.x+m_momentary.y*m_momentary.y;
浮动t动量=sqrt(sqrt动量);
//保留标志供以后使用。
int xSign=m_动量.x/abs(m_动量.x);
int-ySign=m_动量.y/abs(m_动量.y);
//大致确定x和y分量之间的重要性比率
浮动xProp;
浮动yProp;
如果(abs(tMomentum)>m_最大速度)
{
//得到最大速度的平方
int sqMax=m_最大速度*m_最大速度;
//得到每个方向对速度的贡献比例
xProp=(m_动量.x*m_动量.x)/sq动量;
yProp=(m_动量.y*m_动量.y)/sq动量;
//重置,使总速度不超过最大速度。
m_动量x=sqrt(sqMax*xProp)*xSign;
m_动量.y=sqrt(sqMax*yProp)*ySign;
}
///健康检查
//保留旧网膜
浮点数=t动量;
//计算当前力矩
sqMomentum=m_动量.x*m_动量.x+m_动量.y*m_动量.y;
t动量=sqrt(sqrt动量);
//如果仍然太高,打印一份报告。
如果(t动量>m_最大速度)
{
std::cout您应该使用
fabs()
而不是
abs()
来获取浮点数的绝对值。如果您使用integer absolute函数,则结果是一个整数


例如,
-0.5/abs(-0.5)
被视为
-0.5/0
,这导致负无穷大(作为浮点值)它被转换成int的最小值
0x8000000
=
-2147483648

取绝对值并进行除法对我来说是一种可怕的循环浪费。这有什么问题吗

x > 0 ? 1 : -1
你可以把它放在函数里

template <class T>
inline int sgn(const T &x) { return x > 0 ? : 1; }
模板
内联int sgn(const T&x){返回x>0?:1;}

如果只是乘法,您应该能够在10行以内生成一个自包含的测试用例。看起来您正在尝试获得符号(或方向(+1/-1)在这种情况下,矢量组件会失效?如果是,请查看此线程,您也应该阅读以下内容:@RedX非常感谢!我使用了顶部响应的代码,我不再有问题。我将在我的帖子底部添加更好的选项,以供将来参考。不过,我还是很想知道为什么我的代码表现得奇怪。可能是这样有用的知识在未来。考虑使用<代码> CopySufff(1,value)<或代码>,从:或代码> STD::ABS,因为这是C++。AHH,这将解释这个问题。谢谢你的解释。我会在以后记住这一点。这对于警告和注意它们的实践来说是一个很好的例子。对于我来说,我发现使用最严格的警告级别,并警告。作为编译错误,节省的时间比花费的时间多得多。
x > 0 ? 1 : -1
template <class T>
inline int sgn(const T &x) { return x > 0 ? : 1; }