0

我真的很想知道为什么当我使用双精度时这会搞砸我的代码。据我了解,双精度数只是一个更精确的浮点数。然而在下面的代码中,如果我将 float 替换为 double,我会得到一个古怪的输出,即使所有代码所做的只是获取输入并将其吐出。

#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 的输出,正如预期的那样。但是改用双精度并保持输入与以前相同,我得到的输出为 {1.36224e-312,1.78905e-307, 1.81506e-307, 3.15957e+263, 5.3568e-315, 3.44886e-313 }。显然,这甚至不接近正确,而且它不像我在这里处理复数......只是整数1-6。是什么赋予了?

4

2 回答 2

0

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

float temp;
scanf("%f", &temp);
x[y][x] = temp;
于 2012-11-28T02:54:03.033 回答
0

你的循环是错误的:

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

当你定义一个数组

float x[r][c];

数组的索引从零变为大小减一。所以数组的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++) {

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

于 2012-11-28T07:06:39.487 回答