2011-06-03 16 views
5

verir:Fonksiyon Tamam çalışır, ancak ben bu işlevi var çöp

axb = 1383

, a = 1.776, b = 4959
: görmeyi bekliyoruz

float calc_nnc(struct ImageWindow *window1, struct ImageWindow *window2) { 
    /* More code */ 
    double numerator = (double) sum_a_x_b; 
    double divisor = (sqrt(sum_a) * sqrt(sum_b)); 
    double result = numerator/divisor; 
    float resultf = (float) result; 

    printf("numerator: %lf, divisor: %lf, result: %lf, resultf: %f\n", 
     numerator, divisor, result, resultf); 

    return resultf; 
} 

printf baskılar sonucu pay: 1.383,000000, bölen: 2.967,690011, sonuç: 0,466019, resultf: Ancak 0,466019

, ben sonucu yazdırmak için deneyin Başka bir işlevde calc_nnc arasında:

float nnc_likeness; 
unsigned int x, y; 

for (y = 0; y <= y_max; y++) { 
    for (x = 0; x <= x_max; x++) { 
     set_image_window(&window_big, big, x, y, width, height); 
     nnc_likeness = calc_nnc(&window_small, &window_big); 
     printf("likeness: %f\n", nnc_likeness); 
    } 
} 

alıyorum çöp:

benzerlik: Ben calc_nnc hesaplama olduğu doğru değerleri görüyoruz, ama hemen sonra gördüğüm edilir 1055824384,000000

nnc_likeness için bozuk bir değer.

Neler olduğu hakkında bir fikrin var mı? Teşekkürler!

+0

'calc_nnc' için, onu adlandırdığınız bağlamda doğru prototipe sahip olduğunuzdan emin misiniz? Derleyicinizin 'int' türünde bir dönüş türü olduğunu ve sistemin çıldırtıcı olduğunu varsaymak olabilir. Tüm uyarıların etkin mi? –

+1

Aslında gerçekte olduğu gibi görünüyor - şimdi bir cevap yazıyor. –

+0

Başlıktaki prototip aynıdır. Ben -Haydi 've bazı ilginç bir içgörü aldım. –

cevap

8

Muhtemelen diyoruz bağlamda calc_nnc hiçbir prototip, böylece derleyici (spec göre) döndürme türü int olduğunu düşünür. Hızlı bir test programı:

1055824395 0.466019 
1055824384 0.466019 

calc_nnc döner float ve tüm set olacağım kodunuzu söyler doğru bir prototip ekleyin:

#include <stdio.h> 

union u { 
    float f; 
    int i; 
}; 

int main(int argc, char **argv) 
{ 
    union u a; 
    union u b; 

    a.f = 0.466019; 
    b.i = 1055824384; 

    printf("%d %f\n", a.i, a.f); 
    printf("%d %f\n", b.i, b.f); 

    return 0; 
} 

bu çıktıyı verir. Daha fazla uyarı vermek de bu sorunu yakalayacaktır.

+1

Evet, sağol Carl! Tam olarak öyle. Başlık dosyasını eklemeyi unutmuştum. C için yeni biriyim ve bu beni yakaladı. Çok güzel bir açıklama için teşekkürler. –

+1

@Albus - sorun yok. İyi şanslar! –

İlgili konular