两个程序具有相同的代码:浮点溢出

时间:2016-01-18 13:48:40

标签: c++ c loops floating-point initialization

我正在使用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 ++这样的空白页面,而是显示浮点溢出。为什么?

2 个答案:

答案 0 :(得分:3)

我可以在你的代码中看到

 y=y*2*c;

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

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

  

如果没有显式初始化具有自动存储持续时间的对象,则其值为   不定。 [...]

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

  

使用具有自动存储持续时间的对象的值   不确定

您需要初始化自动局部变量,例如

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

等等。

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

答案 1 :(得分:0)

在这两种情况下,y都在没有初始化的情况下使用:

float x,y,c,z;
y=y*2*c;

这会导致未定义的行为,并且编译器应该警告(因此请确保警告已打开,最好是在最高级别)。