C++ C++;:在某个值之后,是否导致数字溢出并从零开始?
假设我有一个名为foo的float。和foo在一定的时间间隔内增加或减少。我如何使foo在成功完成指定的数字/之后再次从零开始,并使其反向递减 例如:C++ C++;:在某个值之后,是否导致数字溢出并从零开始?,c++,math,numbers,C++,Math,Numbers,假设我有一个名为foo的float。和foo在一定的时间间隔内增加或减少。我如何使foo在成功完成指定的数字/之后再次从零开始,并使其反向递减 例如: int max = 0; int min = 50; float foo = 45; foo += 7.5; foo现在将是52.5。但是,由于我在最大值处指定了50,所以我希望它在该点处排序为溢出,因此结果仅为2.5 或: 结果应该是3.3。它刚刚溢了3次水 反过来说: int min = 0; int max = 50; float foo
int max = 0;
int min = 50;
float foo = 45;
foo += 7.5;
foo
现在将是52.5。但是,由于我在最大值处指定了50,所以我希望它在该点处排序为溢出,因此结果仅为2.5
或:
结果应该是3.3。它刚刚溢了3次水
反过来说:
int min = 0;
int max = 50;
float foo = 1;
foo -= 5.5;
结果是-4.5,但应该是44.5
我在想也许这样的事情可以解决这个问题:
foo = foo % max;
if (foo <0)
foo+=max;
foo=foo%max;
如果(fooconst float TOP_CAP=5.0f;
常数浮动低_上限=1.0f;
浮动值=42.0f;
而(值>=上限)
{
值-=顶帽;
而(值<低上限)
值+=低上限;
}
而(值<低上限)
值+=低上限;
如果while
s条件为false,则将跳过循环
或者只需#包括
数学,并使用fmod
const float TOP\u CAP=5.0f;
常数浮动低_上限=1.0f;
浮动值=42.0f;
而(值>=上限)
{
值-=顶帽;
而(值<低上限)
值+=低上限;
}
而(值<低上限)
值+=低上限;
如果while
s条件为false,则将跳过循环
或者只是#包括
数学和使用fmod
包括一个图书馆只是为了获得fmod感觉太过分了
怎么会这样?如果不使用其他函数,它们不会导致任何开销,而且包含cmath
所增加的编译时间肯定是可以忽略的
只要使用标准库,除非你有充分的理由不这样做
你可能想读一下:
包括一个图书馆只是为了获得fmod感觉太过分了
怎么会这样?如果不使用其他函数,它们不会导致任何开销,而且包含cmath
所增加的编译时间肯定是可以忽略的
只要使用标准库,除非你有充分的理由不这样做
你可能想读到:因为#include
太主流了,你可以使用它
if(foo > max)
{
int c = foo / max;
foo = foo - max*c;
}
else if(foo < min)
{
int c = foo / max;
if( c < 0 ) c = c * -1;
foo = foo + max*c;
foo = max + foo;
}
用于:
因为#include
太主流了,你可以使用
if(foo > max)
{
int c = foo / max;
foo = foo - max*c;
}
else if(foo < min)
{
int c = foo / max;
if( c < 0 ) c = c * -1;
foo = foo + max*c;
foo = max + foo;
}
用于:
同意Ivan Rubinson的观点,在while循环中使用单个增量和减量似乎是解决该问题最简单的方法,尤其是当人们只能在间隔之外很短的时间内期望值时
int min = 0;
int max = 50;
int mod = max - min;
float foo = 45;
foo += 7.5;
while(foo >= max) foo -= mod;
while(foo < min) foo += mod;
intmin=0;
int max=50;
int mod=最大-最小值;
浮点数foo=45;
foo+=7.5;
而(foo>=max)foo-=mod;
而(foo
同意Ivan Rubinson的观点,在while循环中使用单个增量和减量似乎是解决该问题最简单的方法,尤其是当人们只能在间隔之外很短的时间内期望值时
int min = 0;
int max = 50;
int mod = max - min;
float foo = 45;
foo += 7.5;
while(foo >= max) foo -= mod;
while(foo < min) foo += mod;
intmin=0;
int max=50;
int mod=最大-最小值;
浮点数foo=45;
foo+=7.5;
而(foo>=max)foo-=mod;
而(foo
您可以使用fmod
进行浮点模运算抱歉,没有读最后一行。您可以实现一个新类型并重载所有运算符,但是如果您需要使用math.h
中的函数,这是一项大量工作。或者,在没有fmod的情况下实现您自己的fmod,为什么不使用它?@Forivinfmod
is是标准库的一部分,这意味着无论您是否使用它,您的程序都将包含它。那么为什么不使用它呢?“但为什么我必须使用#include
才能使用它?”-因为符号必须在使用之前声明,这是任何一个单遍编译器的特性。这是C++ 101,确实。也许你应该访问并获得其中的一些。你可以使用<代码> fMOD< /COD>浮点模运算。抱歉,没有读最后一行。你可以实现一种新的类型,并且重载所有的操作符,但是如果你需要math.h中的函数。这是一个很大的工作。或者,在没有fmod的情况下实现你自己的fmod,为什么不使用它?@Forivinfmod
是标准库的一部分,这意味着无论你是否使用它,你的程序都会包含它。那么为什么不使用它呢?“但是为什么我必须使用#include
才能使用它呢?"-因为符号必须在使用之前声明,这是任何一个单遍编译器的特性。这是C++ 101,真的。也许你应该访问并获得其中一些。我只是担心,因为我的目标系统只有2000字节的RAM。@福里文:2 KIB的RAM听起来非常小,即使是嵌入式系统。如果真的是这样。您所拥有的一切,都是您需要解决的问题。@Forivin:包含一个标头不会使用任何额外的ram。但是,编写您自己的函数而不是使用库可能会有这种情况。通常,编译器知道标准库函数,并将其转换为单个操作。如果您编写自己的,它就不能这样做。I“我只是担心,因为我的目标系统只有2000字节的RAM。@Forivin:2千字节的RAM听起来很小,即使对于嵌入式系统来说也是如此。如果这真的是你所有的,那你就有问题了。@Forivin:包括一个头并没有使用任何额外的RAM。但是,编写你自己的函数而不是使用它。”g库可能会。通常,编译器知道标准库函数,并将其转换为单个操作。如果你自己编写,它就不能这样做。虽然使用While
似乎是最简单的解决方案,但你的代码并不能满足问题的要求。尤其是它不会导致模运算,如y您有两个增量。虽然使用While
似乎是最简单的解决方案,但您的代码并不能满足问题的要求。尤其是它不会产生结果
int min= 0;
int max= 50;
float foo = 45;
foo += 7.5;
int min = 0;
int max = 50;
int mod = max - min;
float foo = 45;
foo += 7.5;
while(foo >= max) foo -= mod;
while(foo < min) foo += mod;