1
float a, b;
float sa() { return a;};
int main() {
  a = 10;
  b = sa();
  printf("%f", b);
  return 0;
}

これは私のコードの簡略版です。プログラムは 10 を出力するはずだと思いますが、-65550 のような非常に小さい数値が得られます。常に同じとは限りませんが、非常によく似ています。

variabeaが返される直前にデバッガーを使用してその値を確認しましたが、それは 10 であるため、関数は 10 を返しますが、b は -65550 のような値に設定されています。なぜこれが起こるのかわかりません。

情報をいただければ幸いです。

前もって感謝します。

完全なコードは次のとおりです。

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

int dimensiuni, nrBitiSolutie, bitiPeDimensiune, gasitInbunatatire, nrRulari;
float limInf, limSup, precizie, valoareFunctie, minim, minimNou, T;
char solutie[100000];
float solutieReala[100];

void generateRandomSolution();
void bitesToFloat();
void rastrigin();
void rosenbrock();
float nextFirstFit();
float nextBestFit();


void main() {
    int k;
    T = 10;
    gasitInbunatatire = 1;
    srand ( time(NULL) );
    printf("Introduceti numarul de dimensiuni: ");
    scanf("%d", &dimensiuni);
    printf("Introduceti limita inferioara si cea superioara: ");
    scanf("%f%f", &limInf, &limSup);
    printf("Introduceti precizia: ");
    scanf("%f", &precizie);

    //calculam numarul de biti necesari ca sa reprezentam solutia
    nrBitiSolutie = dimensiuni * ceil(log(limSup-limInf * pow(10, precizie)))/log(2.0);
    bitiPeDimensiune = nrBitiSolutie/dimensiuni;

    //generam o solutie random
    generateRandomSolution();
    bitesToFloat();
    rastrigin();
    minim = valoareFunctie;

    printf("Pornim de la %f\n", minim);

    while( (nrRulari < 10000) && (T > 0.001)) {
        minimNou = sa(); //error occurs here. sa() returns about 200 but minimNou is set to -65550
        if (minimNou < minim) {
            printf("Minim nou: %f\n", minimNou);
            minim = minimNou;
            T *= 0.995;
        }
        nrRulari++;
    }
    printf("Minimul aproximat: %f\n", minim);
    system("pause");
}

void generateRandomSolution() {
    int l;
    for (l = 0; l < nrBitiSolutie; l++) solutie[l] = rand()%2;
}

void bitesToFloat() {
    int i, parcurse = 1, gasite = 0;
    int variabila = 0;
    float nr;
    for (i = 0; i < nrBitiSolutie; i++) {
        variabila = variabila<<1 | (int)solutie[i];
        if(parcurse == bitiPeDimensiune) {
            nr = (float)variabila / (float)pow(2, bitiPeDimensiune);
            nr *= limSup-limInf;
            nr += limInf;
            nr *= pow(10, precizie);
            nr = (int)nr;
            nr /= pow(10, precizie);
            parcurse = 0;
            solutieReala[gasite++] = nr;
            variabila = 0;
        }
        parcurse++;
    }
}

void rastrigin() {
    int i;
    valoareFunctie = 10 * dimensiuni;
    for (i = 0; i < dimensiuni; i++) {
        valoareFunctie += pow((float)solutieReala[i], 2) - 10 * (float)cos(2 * 3.14 * (float)solutieReala[i]);
    }
}

void rosenbrock() {
    int i;
    valoareFunctie = 0;
    for (i = 0; i < dimensiuni - 1; i++) {
        valoareFunctie += 100 * pow((solutieReala[i+1] - pow(solutieReala[i], 2)), 2) + pow((1-solutieReala[i]), 2);
    }
}

float sa() {
    int j;
    for (j = 0; j < nrBitiSolutie; j++) {
        solutie[j] = solutie[j] == 0 ? 1 : 0;
        bitesToFloat();
        rastrigin();
        if (valoareFunctie < minim) return valoareFunctie;
        else if ( (rand()/INT_MAX) < exp((minim - valoareFunctie)/T) )  
            return valoareFunctie;
        else solutie[j] = solutie[j] == 0 ? 1 : 0;
    }
    return minim;
}

エラーが発生した場所をerror occurs hereコメントでマークしました

4

1 に答える 1

5

コードを誤って簡略化しました。あなたの単純化では、sa()それを呼び出す前に定義しました。ただし、完全なプログラムでは、sa()定義する前に呼び出します。宣言がない場合、関数は を返すと見なされintます。関数は実際には を返すためfloat、結果は未定義です。(この場合、浮動小数点スタックの一番上からガベージ値を読み取ると、浮動小数点スタックがアンダーフローし、そこから下り坂になります。)

于 2012-12-06T23:04:46.193 に答える