c - (C) printf 仅返回 0.(0) 和 %lf

标签 c printf

请解释一下为什么 for 循环中的 printf 仅返回 0.00000 min 是一个非常大的值。尝试使用 float%f,但它仅返回 nan。

#include <stdio.h>
#include <math.h>
#include <conio.h>

double getMin (double xf,double yf,double zf)
{
    if (xf < yf && xf < zf)
    {
        return (xf);
    }
    else if (yf < xf && yf < zf)
    {
        return (yf);
    }
    else return (zf);
}

int main()
{
    double getMin (double xf,double yf,double zf);
    double x = 1, y = 0,  z = 1, min = 0;
    for (int j = 3 ; j >= -2 ; j--)
    {
        x = (sin(pow(j, (1 / 2))) / (j + 1)) * x;
        printf("\nP #1=%lf", x);
    }

    for (int k = 5 ; k <= 9 ; k++)
    {
        y = cos(k / (k - 10)) + y;
        printf("\nS #1 = %lf", y);
    }

    for (int l = 2 ; l <= 8 ; l++)
    {
        z = (log10(l - 4)) * z;
        printf("\nP #2= %lf", z);
    }
    min = getMin(x, y, z);
    printf("\nM = %lf", min);
    getch();
}

最佳答案

您的代码中存在多个问题。

  • 您混合了整数算术和浮点算术。 1 / 2计算结果为 0 ,而1. / 2计算结果为 0.5 。同样,您必须写 k / (k - 10.)如果你想要浮点运算。

  • printf double 的格式是 %f ,不是%lfl希望会被忽略。它在我的系统上,但也许它在您的环境中做了一些可疑的事情。 printf格式与 scanf 不一致格式:避免使用 scanf 的又一个原因.

  • 重新声明 getMinmain 的局部范围内是无用且不好的做法。

  • 在第一个循环中,您计算​​ pow(j, (1 / 2)) 。您可能是说 pow(j, 0.5)sqrt(j) 相同。然而j取值-1-2 ,产生nan正如预期的那样,pow(j, 0.5)计算实数域中的平方根,而不是复数域中的平方根。

  • 计算 log(l - 4)对于 l=2还返回 nan因为log负值未定义。

通过这些修复,执行代码会给出以下输出:

P #1=0.246757
P #1=0.081246
P #1=0.034183
P #1=0.000000
P #1=nan
P #1=nan
S #1 = 0.540302
S #1 = 0.611040
S #1 = -0.079719
S #1 = -0.733362
S #1 = -1.644493
P #2= nan
P #2= nan
P #2= nan
P #2= nan
P #2= nan
P #2= nan
P #2= nan
M = nan

这对我来说似乎不正确:nan < xx < nan始终评估为 false,因此 getMin(nan, y, nan)返回nan .

关于c - (C) printf 仅返回 0.(0) 和 %lf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33902267/

相关文章:

c++ - fgets 只读取文件的第一行

c++ - 没有空格的宏

c - sprintf 代码占用大量空间(嵌入式)

c - 请解释以下代码片段?

c - 控制台输出中的 UTF-8 字符

C复数和printf

c - 与 sleep() 结合使用时,管道无法按预期工作

c - 确定 EOF 的优雅方法?

c - 为什么 Bison 在第一个标记后期待 $end?

c - 在没有 if 条件的情况下调用等于运算符