【发布时间】:2012-11-28 02:48:36
【问题描述】:
我真的很想知道为什么当我使用双精度时这会搞砸我的代码。据我了解,双精度数只是一个更精确的浮点数。然而在下面的代码中,如果我将 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。什么给了?
【问题讨论】:
-
如果使用double,需要用
%lf读取输入 -
当您定义像
x[r][c]这样的数组时,该数组的有效索引为0..r-1和0..c-1。 -
我很惊讶您的代码不会产生分段错误,因为您从 1...r (r 数据结构的大小)进行迭代,而在 C 中,数组和矩阵的编号为 0 ...r-1
-
我认为它不会产生分段错误,因为 segmetns 比单个浮点数大得多。它会在 Microsoft Visual C 等一些调试环境中触发错误,因为它会在每个数组后放置一个额外的空间来查看此类错误。但不是每个 C 编译器的一般情况。
-
这是 nhahtdh 所说的。我不知道 scanf 需要一个不同的双打参数。 Jerry 和 Hernan,虽然你们俩都是正确的,但我之前已经注意到,由于某种原因,它似乎没有产生任何错误或导致任何问题,所以我就这样离开了。马虎,我知道。感谢您的帮助,我会尽快回答我自己的问题
标签: c