【问题标题】:decimal points omitted in typecasting heavy program类型转换繁重程序中省略小数点
【发布时间】:2013-03-25 18:49:25
【问题描述】:

我已经为高斯消除方法编写了这段代码:

#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;
}

但是,它不会打印正确的输出值。对输出的分析表明这些值已被四舍五入或其他东西。我猜在某个地方已经考虑了二维数组的整数值,即使我将该数组作为双精度数组并且仅对语法有效的元素地址使用类型转换。你可以自己试试这个矩阵:

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 编译器。

【问题讨论】:

  • 为什么将 i、j、k 和 p 声明为浮点数,然后将它们转换为整数?您是否反对将它们声明为整数?
  • 我尝试将它们声明为整数,但它们仍然给出了一个四舍五入的值。帮助。
  • 您的算法是否甚至修改了您的想法?运行您的程序会导致左下角的 1,2,3 三角形被归零 - 仅此而已。

标签: c floating-point int printf


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

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

【讨论】:

    【解决方案2】:

    问题可能与舍入无关(您传递给数组的索引不应影响数组本身的任何舍入)。

    我在主循环中添加了一个打印语句,只是为了查看在执行每行减法时使用了哪些系数,并且它们在每列之间似乎有所不同,因此您的数学很可能是错误的。我怀疑这与您的p 变量有关,该变量始终固定为k 上方的行,我认为这对您没有帮助。

    您想要获取每对行的行系数,然后减去您用于消除的行乘以该系数。系数为 M(1,0)/M(0,0) 用于第二行逐第一行消除,M(2,1)/M(1,1) 用于第三行逐第二行消除,一般而言,M(I,K)/M(K,K)(其中 K 是正在使用的行要消除,而我是您要消除的那一行)。

    最终你想做的事:

    For each row K excluding the last row (0 to 1)...
        For each row I after it (K+1 to 2)...
            Get the row factor = M(I, K) / M(K, K).
            For each column J (0 to 3)...
                M(I, J) -= M(K, J) * factor
    

    将其(几乎直接)翻译成代码,结果应该是:

    10.000000  -1.000000  2.000000   4.000000
    -0.000000  10.100000  -1.200000  2.600000
    -0.000000  -0.000000  19.980198  5.376237
    

    【讨论】:

    • 我不赞成直接给出看似家庭作业问题的代码。
    • 好点,我(也许天真地)没有考虑到这一点。我已经编辑了最终的解决方案,但我不认为从伪代码中提取它会很困难。
    • 来吧,显然我的问题不是作业问题。我的意思是我不要求你做我的作业。我只是问你编程语言中是否存在一些转换问题。碰巧问题出在逻辑上。那么你怎么能指出这是一个家庭作业问题。
    猜你喜欢
    • 2018-11-26
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2019-05-26
    • 2020-09-12
    • 1970-01-01
    相关资源
    最近更新 更多