c - float 取意外高的值

标签 c for-loop floating-point

我编写了一个 C 脚本,可以为另一个应用程序生成文本文件。 float “b”得到一个非常高的值,我不知道为什么。我有一个几乎相同的文件,但没有发生这种情况。我是 C 新手,所以任何帮助将不胜感激 - 我明白这可能是一个非常简单的错误。代码如下。

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


#define LARGESTR 1000
#define INITIALTIME 40

void clear_string(char *s,int l)
{
    int i;

    for(i=0; i<l; i++)
        s[i]='\0';
}

int main(void)
{
    char buffer[LARGESTR];
    int ramp_flow = 5, car_count_seg1 = 45, car_count_seg2 = 45, car_count_seg3 = 45, fw_upstream_queue = 20, onramp_queue = 60, a;
    float outflow_count, percentout = 0.7, b;

    //Total Input to system
    for(a=(INITIALTIME + 10); a<(INITIALTIME + 250); a+=10) {
        if((a>=10) && (a<600)) {
            b=b+1.39+0.556;
        }
        if((a>=600) && (a<1200)) {
            b=b+(((a*9.167)-5000)/360)+(((a*1.67)-800)/360);
        }
        if((a>=1200) && (a<2700)) {
            b=b+16.67+3.33;
        }
        if((a>=2700) && (a<3300)) {
            b=b+(((a*(-10))+33000)/360)+(((a*(-2))+6600)/360);
        }
        if((a>=3300) && (a<4800)) {
        }
    }
    printf("%f\n", b);
    b = b + car_count_seg1 + car_count_seg2 + car_count_seg3 + fw_upstream_queue + onramp_queue;
    printf("%f\n", b);
    outflow_count = b*percentout;
    printf("%f\n", outflow_count);

    FILE *fp;

    fp=fopen("1rampproblem.pddl","w+");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"\n(define (problem trafficjuncprob)\n(:domain traffic-junction)\n(:objects)\n(:init");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (outflow-count) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (critical-density) 45)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (maximum-density) 270)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (maximum-flow) 20)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (time) %d)",INITIALTIME);
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (zero) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (toggle) 1)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (count) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (ramp-flow) %d)",ramp_flow);
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (ramp-flow-realised) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (car-count-seg1) %d)",car_count_seg1);
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (car-count-seg2) %d)",car_count_seg2);
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (car-count-seg3) %d)",car_count_seg3);
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (maxflow-0-1) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (maxflow-1-2) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (maxflow-2-3) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (maxflow-3-4) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (flow-0-1) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (flow-1-2) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (flow-2-3) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (flow-3-4) 0)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (fw-upstream-queue) %d)",fw_upstream_queue);
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(= (onramp-queue) %d)",onramp_queue);
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n)\n\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(:goal (> (outflow-count) %f)\n)\n", outflow_count);
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    clear_string(buffer,LARGESTR);
    sprintf(buffer,"(:metric minimize (total-time))\n)");
    fprintf(fp,"%s",buffer);
    fprintf(fp,"\n");

    fclose(fp);

    return 0;
}

最佳答案

其声明中没有 b 的初始化器:

float outflow_count, percentout = 0.7, b;

因此,第一次使用之前它的值是该单词之前使用时留在堆栈中的值。每个后续值都取决于其初始值,因此没有理由期望具有任何特定值。

我建议对其进行初始化。

剩下的部分是关于如何提问的提示。您应该做的第一件事是删除程序中不需要重现错误的所有内容。由于在第一个循环后打印 b 时出现问题,因此我删除了之后的所有内容,然后删除了因此而变得未被引用的声明:

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

#define LARGESTR 1000
#define INITIALTIME 40

int main(void)
{
    int a;
    float b;

    //Total Input to system
    for(a=(INITIALTIME + 10); a<(INITIALTIME + 250); a+=10) {
        if((a>=10) && (a<600)) {
            b=b+1.39+0.556;
        }
        if((a>=600) && (a<1200)) {
            b=b+(((a*9.167)-5000)/360)+(((a*1.67)-800)/360);
        }
        if((a>=1200) && (a<2700)) {
            b=b+16.67+3.33;
        }
        if((a>=2700) && (a<3300)) {
            b=b+(((a*(-10))+33000)/360)+(((a*(-2))+6600)/360);
        }
        if((a>=3300) && (a<4800)) {
        }
    }
    printf("%f\n", b);
    return 0;
}

在这个精简的程序中,问题更加明显。

您的问题报告应该包含一个精简的程序,其中仅包含相关代码、b 的预期值、您预期的原因以及您实际得到的内容。

关于c - float 取意外高的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28527043/

相关文章:

c++ - 在 Mac OS X Lion 上使用 OpenMP 编译失败(memcpy 和 SSE 内在函数)

linux - 在 bash for 循环中调用当前项和下一项

floating-point - 为什么 float 不正确?

c - 同样简单的计算,不同的结果

C - 将 char 转换为 int 以对输出执行按位操作

C 编程 : difference between++i and i=i+1 from an assembler point of view?

c - 执行时出错 : Segmentation fault

c - 特洛伊木马(C语言中的简单客户端-服务器)

r - For循环日期不丢失日期格式

powershell - Foreach循环在PowerShell中不起作用