c - 在类型转换繁重的程序中省略小数点

标签 c floating-point int printf

我为高斯消元法编写了这段代码:

#include <stdio.h>
int main()
{
    float arr[3][4]={{0}}, i, j, k, p;
    printf("Enter the coefficients:-\n");
    for(i=0; i<3;i++)
    {
        printf("Row #(%d)\n", (int)(i+1));
        for(j=0; j<4; j++)
        {
            scanf("%f", &arr[(int)i][(int)j]);
        }
    }
    for(k=1, p=(k-1); (k<=2); k++, p++)
    {
        for(i=k; i<=2; i++)
        {
            for(j=0; j<=3; j++)
            {
                arr[(int)i][(int)j]-=((arr[(int)i][(int)p]/arr[(int)p][(int)p])*arr[(int)p][(int)j]);
            }
        }
    }
    for(i=0; i<3;i++)
    {
        for(j=0; j<4; j++)
        {
            printf("%0.3f  ", arr[(int)i][(int)j]);
        }
        printf("\n");
    }
    return 0;
}

但是,它不会打印正确的输出值。对输出的分析表明这些值已被四舍五入或其他原因。我猜测在某个地方已经考虑了二维数组的整数值,即使我将数组视为 double 并且仅对语法有效的元素地址使用类型转换。您可以通过矩阵来尝试一下:

R1-   10  -1  2  4
R2-   1   10 -1  3
R3-   2   3  20  7

正确的输出应该是:

R1-   10    -1        2         4
R2-   0    10.1     -1.2       2.6
R3-   0     0       19.980    5.376

我正在使用 GNU GCC 编译器。

最佳答案

  1. 使用整数类型声明用于数组索引的所有变量。
  2. 摆脱所有 Actor 。您不需要其中任何一个。
  3. 将行号和列号的所有常量替换为 RowsColumns ,您只需定义一次。
  4. 在循环范围内保持一致;不要使用j < 4在某些地方和 j <= 3在其他人中。 (两者都将变为 j < Columns 。)
  5. 摆脱p .
  6. k 上的循环迭代源行,即包含将用于取消其他元素的数据的行。它运行for (k = 0; k < Rows-1; ++k) .
  7. i 中的循环迭代您为每个 k 取消的目标行。它运行for (i = k+1; i < Rows; ++i) .
  8. 取消时要使用的系数是列 k 中元素之间的比率行数 ik 。计算一次并称其为factor .
  9. 对于行中的每一列i ,从那里的元素中减去 factor乘以行中同一列的元素k .

我如上所述编写了代码,它打印了您所说的预期结果。

关于c - 在类型转换繁重的程序中省略小数点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15798619/

相关文章:

c - 在 C 中通过引用传递的微妙之处

c - vim 似乎没有找到 .clang_complete

Python替换 float 只​​给出整数

python - Python 中二进制的浮点表示(位非十六进制)

python - x 具有类型函数,但调用 x 会出现类型错误 Python3

c - XtAppAddWorkProc 注册的函数被调用多次

c - 如何在 Fortran 中调用 C 函数并正确传递 uint32_t 参数

java - float 舍入到2位小数java

c++ - 为什么 Visual Studio 不将无符号值显示为 int?

php - 在 PHP 中使用 "(int)"输入安全性?