Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:在某个值之后,是否导致数字溢出并从零开始?_C++_Math_Numbers - Fatal编程技术网

C++ C++;:在某个值之后,是否导致数字溢出并从零开始?

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

假设我有一个名为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 = 1;
foo -= 5.5;
结果是-4.5,但应该是44.5

我在想也许这样的事情可以解决这个问题:

foo = foo % max;
if (foo <0)
    foo+=max;
foo=foo%max;
如果(foo
const 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
,为什么不使用它?@Forivin
fmod
is是标准库的一部分,这意味着无论您是否使用它,您的程序都将包含它。那么为什么不使用它呢?“但为什么我必须使用
#include
才能使用它?”-因为符号必须在使用之前声明,这是任何一个单遍编译器的特性。这是C++ 101,确实。也许你应该访问并获得其中的一些。你可以使用<代码> fMOD< /COD>浮点模运算。抱歉,没有读最后一行。你可以实现一种新的类型,并且重载所有的操作符,但是如果你需要math.h中的函数。这是一个很大的工作。或者,在没有fmod的情况下实现你自己的fmod
,为什么不使用它?@Forivin
fmod
是标准库的一部分,这意味着无论你是否使用它,你的程序都会包含它。那么为什么不使用它呢?“但是为什么我必须使用
#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;