与float相比,Double产生奇数输出

时间:2012-11-28 02:48:36

标签: c

我真的很想知道为什么当我使用双精度时这会搞砸我的代码。根据我的理解,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");
    }
}

在使用float的情况下,在为行输入2,为列输入3之后,数字1-6,我得到1-6的输出,如预期的那样。但是使用double代替,并保持输入与之前相同,我得到{1.36224e-312,1.78905e-307,1.81506e-307,3.15957e + 263,5.35668e-315,3.44886e-313的输出}。显然,这甚至不接近正确,而且它不像我在这里处理复数...只是整数1-6。是什么给了什么?

2 个答案:

答案 0 :(得分:0)

scanf %f需要float的地址。将scanf的数据直接读取到不是本地的变量是危险的,因为很难看出它实际上不是float。我会以这种方式更改代码以使其更加健壮:

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

答案 1 :(得分:0)

你的循环错了:

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

定义数组时

float x[r][c];

数组的索引从零到大小减去1。因此y数组的x限制为

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

将循环更改为

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

请注意,它们现在从零开始,并使用小于比较运算符。