2012-11-28 67 views
0

我真的很想知道爲什麼當我使用雙精度時,這會導致我的代碼出現問題。根據我的理解,double是一個更精確的浮點數。然而,在下面的代碼中,如果我用double替換float,那麼即使所有的代碼都在做輸入,然後將其吐出,我也會得到一個古怪的輸出。與浮點數相比,雙產生奇數輸出

#include <stdio.h> 

int y; 
int z; 
int i; 
int n; 
int r; 
int c; 
float e; 
float d; 

void main() { 
    puts("Enter Row Number:"); 
    scanf("%i", &r); 
    puts("Enter Column Number:"); 
    scanf("%i", &c); 
    float x[r][c]; 
    int j = r; 

    for(y = 1; y <= r; y++) { 
     for(z = 1; z <= c; z++) { 
      scanf("%f", &x[y][z]); 
     } 
    } 
    for (y = 1; y <= r; y++) { 
     for(z = 1; z <= c; z++) { 
      printf("%g\t", x[y][z]); 
     } 
     puts("\n"); 
    } 
} 

在使用浮動,輸入2行後的實例,和圖3爲列,那麼數字1-6,我得到1-6的輸出,如所預期。但是使用double而不是,並且保持輸入與以前相同,我得到{1.36224e-312,1.78905e-307,1.81506e-307,3.15957e + 263,5.3568e-315,3.44886e-313的輸出}。顯然,這甚至不是正確的,它不像我在這裏處理複數......只是整數1-6。是什麼賦予了?

+8

如果你使用double,你需要用'%lf'來讀取輸入 – nhahtdh

+1

當你定義一個像'x [r] [c]'這樣的數組時,該數組中的有效索引是'0'..'r-1 '和'0'..'c-1'。 –

+0

我很驚訝你的代碼不會產生分段錯誤,因爲你從1 ... r(r是數據結構的大小)進行迭代,而在C中,數組和矩陣的編號爲0 ... r-1 –

回答

0

scanf %f預計地址爲float。將scanf的數據直接讀入非本地變量是很危險的,因爲很難發現它實際上不是float。我想改變這樣的代碼更健壯:

float temp; 
scanf("%f", &temp); 
x[y][x] = temp; 
0

你的循環是錯誤的:

for(y = 1; y <= r; y++) { 
    for(z = 1; z <= c; z++) { 

當你定義數組

float x[r][c]; 

數組的索引從去零到大小減一。所以x陣列的y限制是

x[0] /* first sub-array */ 
x[r - 1] /* last sub-array */ 

更改您的循環,以

for(y = 0; y < r; y++) { 
    for(z = 0; z < c; z++) { 

需要注意的是,他們現在在零開始,並使用小於比較操盤手。