Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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++_Loops_Double_Long Integer - Fatal编程技术网

C++ 简单循环不适用于随机数

C++ 简单循环不适用于随机数,c++,loops,double,long-integer,C++,Loops,Double,Long Integer,我是一个编程新手。我需要一个简单的函数将小数点为X.YZ的任何数字转换为XYZ。我把它乘以10倍,然后使用双精度到整数的转换 intmain() { std::cout a; while(b!=a) { a*=10; b=a; } std::cout您的问题是您从未初始化b,因此具有未定义的行为 您应该这样做: long b = 0; 现在你可以把b和其他东西进行比较,获得良好的行为 还应将浮点与积分类型进行比较,就像与适当的ε值进行比较一样: while(fabs(an_int - a

我是一个编程新手。我需要一个简单的函数将小数点为X.YZ的任何数字转换为XYZ。我把它乘以10倍,然后使用双精度到整数的转换


intmain()
{
std::cout a;
while(b!=a)
{
a*=10;
b=a;
}

std::cout您的问题是您从未初始化
b
,因此具有未定义的行为

您应该这样做:

 long b = 0;
现在你可以把b和其他东西进行比较,获得良好的行为

还应将
浮点
积分
类型进行比较,就像与适当的ε值进行比较一样:

 while(fabs(an_int - a_float) < eps) 
while(fabs(一个整数-一个浮点数)
这里您定义了
b
。从这一点来看,变量包含垃圾值。该值可以是绝对随机的,基本上就是分配时内存中发生的情况。在此之后,您将在以下条件下使用该变量:

 while(b!=a)
这将导致未定义的行为,这基本上意味着任何事情都可能发生,包括根据
b
中的垃圾值,应用程序似乎正在工作的机会(如果幸运的话)


为了避免这种情况,您需要使用一些值初始化
b
,例如,
long b=0

许多十进制浮点数不能精确地用二进制表示。您只能得到近似值

如果132.54表示为132.5399999999999,则永远不会得到匹配项



打印循环中的值,您将看到发生了什么。

问题是大多数十进制值不能精确地表示为浮点值。因此,只有两位数的十进制值不能保证乘以足够的十次将生成一个没有小数部分的浮点值。请看this,每次通过循环显示
a
的值。低位有很多噪音。

与其将其作为双精度读入,不如将其作为字符串读入并解析。这样就不会遇到浮点精度问题。

函数中的变量定义没有使用默认值初始化,因此您的b变量contAIN随机值。这将在第一轮后解决,但不能解释为什么循环会永远运行。强制性的,没有不确定的行为,它是未定义的行为或未指定的行为,但不是你说的。在这种情况下,它只是UB。不管怎样,问题不在这里;这是基本假设,mut如果乘以10次,最终将得到一个没有小数部分的值。我做到了,但仍然没有任何变化。132.54这个数字会一直无限地运行。@Stan,@ratzip,当然它会无限地运行。如果你给它传递一个不能用
float
准确表示的数字,你将永远不会得到匹配,因为这个值ll b like
132.53(9)
在你的情况下。哦,谢谢。我从来没有意识到。那么我该如何处理这些数字呢?@StanislawT-你该怎么做?清楚你的要求是什么。你给出的示例的解决方案似乎是乘以100,然后四舍五入到最接近的整数。不过,更一般地说,这些数字来自哪里?如果它们以tex开头你需要删除小数点,这很简单;不涉及浮点。只需删除小数点。我需要用户能够在double的内存范围内输入任意可处理的随机数(如果我正确,则为64位)。然后,结果将用于进一步的计算,这些计算是乘和除。@StanislawT-是的,double现在通常是64位——53位的分数(包括1个隐式位),11位指数,1位符号。但是当有人输入数字时,比如说6.02e23,你想把它改成什么?老实说。我还不知道。这个问题对于我的级别来说太复杂了。我现在将尝试用字符串解决问题。@TonyTheLion-试试。如果
b
初始化,问题会消失吗?取消我的定义ned behavior并不意味着坏事一定会发生。它只意味着它所说的:语言定义不会告诉你发生了什么。在这种情况下,效果是良性的。天哪,我会对新编辑再次投反对票。是的,添加一个人为的平等定义可能会消除症状,但不会修复潜在的问题正确的假设。比较浮点值和整数值并没有本质上的错误,所以切换到几乎相等必须是整体设计的一部分,而不是解决误解的一种方法。@PeteBecker现在你会对OP的代码设计做什么改变以使其更好?@TonyTheLion-我不知道。这是一个错误我不清楚代码的目的是什么,这就是为什么我在对另一个答案的评论中问这个问题。你必须知道你要去哪里,然后再去想办法。@TonyTheLion-不,几乎相等并没有浮点数那么好。事实上,这通常是不理解的人的回答了解他们遇到的问题,这通常只会增加他们的问题。谢谢。很有趣。那么我该如何正确地做到这一点?@StanislawT没有“正确”。@StanislawT作为替代方法,我建议您将输入转换为字符串并手动删除点。@jrok或逗号。使用区域设置方面…简单:)
long b;
 while(b!=a)