(C)printf仅返回0.(0)%lf

时间:2015-11-24 19:34:40

标签: c printf

请解释一下,为什么printf in循环只返回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();
}

2 个答案:

答案 0 :(得分:1)

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

  • 混合整数运算和浮点运算。 1 / 2评估为0,而1. / 2评估为0.5。同样,如果需要浮点运算,则必须编写k / (k - 10.)

  • printf的{​​{1}}格式为double,而非%f。希望%lf被忽略。它在我的系统上,但也许它在您的环境中做了一些可疑的事情。 l格式与printf格式不一致:避免使用scanf的另一个原因。

  • scanf的本地范围内重新声明getMin是无用且不好的做法。

  • 在第一个循环中,您计算​​main。您可能意味着pow(j, (1 / 2))pow(j, 0.5)相同。然而,sqrt(j)采用值j-1,按预期产生-2nan计算真实域中的平方根,而不是复杂域。< / p>

  • 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 < x总是评估为false,因此x < nan会返回getMin(nan, y, nan)

答案 1 :(得分:0)

使用此代码(与发布的代码相同),在输出中添加一些间距并在代码布局中进行更正:

P #1=0.059006
P #1=0.024826
P #1=0.020890
P #1=inf
P #1=-inf


S #1 = 0.540302
S #1 = 1.080605
S #1 = 0.664458
S #1 = 0.010814
S #1 = -0.900316


P #2= nan
P #2= nan
P #2= nan
P #2= nan
P #2= nan
P #2= nan
P #2= nan


M = nan

导致此输出:

getMin()

输出的原因是:

这些表达式:(1/2)是整数表达式。这个将评估为0,因为整数不能有分数。

摘自pow()&#34的手册页;如果x是小于0的有限值,并且y是有限非整数,则会发生域错误,并返回NaN。&#34;

摘自log10的手册页(和log())&#34;如果x是NaN,则返回NaN。如果x为1,则结果为+0。如果x为正无穷大,则返回正无穷大。如果x为零,则发生极点错误,并且函数分别返回-HUGE_VAL,-HUGE_VALF或-HUGE_VALL。如果x为负(包括负无穷大),则发生域错误,并返回NaN(不是数字)。&#34;

正在传递对-inf的调用-0.900316nannan,这些调用均被视为有效的双号,因此返回[select type="open"] [option value=x] [...] [select type="close"] add_shortcode('select', 'shortcodeSelect'); function shortcodeSelect($atts) { if ($atts['type'] === 'open') { return '<select>'; } return '</select>'; } add_shortcode('option', 'shortcodeOption'); function shortcodeOption($atts) { $value = isset($atts['value']) ? $atts['value'] : ''; return '<option value="' . $value . '">' . $value . '</option> }

以上段落解释了为什么输出如所示。

强烈建议阅读/理解代码中调用的系统函数。