gpt4 book ai didi

c++ - 两个代码相同的程序 : floating point overflow

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:01 24 4
gpt4 key购买 nike

我正在使用 DEV c++。并且刚刚遇到一个非常奇怪的问题。

首先,我在这里复制运行良好的程序代码。

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>

#define f(x) 0.2027*sqrt(1-x*x)

int main()
{
int k=0; //<----the change is here
float x,y,c,z;

c=0.6366198;
do {

x=2*(rand()/(float)RAND_MAX)-1;

z=rand()/(float)RAND_MAX;
y=y*2*c;

if (y<=f(x)) {
printf("%f\t",x);
k=k+1;
}
} while(k<=100); // <--the change is here

getchar();
}

在这里,如果我稍微更改 while 条件以使程序更通用一些,在 DEVc++ 中什么也不会发生。我只看到一个“空白页”;

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>

#define f(x) 0.2027*sqrt(1-x*x)

int main()
{
int k=0,t=100; //<----the change is here
float x,y,c,z;

c=0.6366198;

do {
x=2*(rand()/(float)RAND_MAX)-1;

z=rand()/(float)RAND_MAX;
y=y*2*c;

if (y<=f(x)) {
printf("%f\t",x);
k=k+1;
}
} while(k<=t); // <--the change is here

getchar();
}

在 turboc++ 中也发生了同样的事情。它不是像 Devc++ 那样显示空白页,而是显示 float 溢出。为什么?

最佳答案

如我所见,在你的代码中

 y=y*2*c;

y 未初始化使用。作为一个自动局部变量,初始值是不确定的。因此,您的两个代码都调用了 undefined behavior .

引用标准,章节 §6.7.9,初始化

If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. [...]

并且,对于未定义的行为,附件§J.2

The value of an object with automatic storage duration is used while it is indeterminate

你需要初始化你的自动局部变量,比如

float x = 1, y = 2, c = 3, z = 4;  //values are for example purpose

等等。

故事的寓意:请打开编译器警告并注意它们。

关于c++ - 两个代码相同的程序 : floating point overflow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34856298/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com