当我使用`float`s而不是`double`s时,为什么`sqrt()`打印所需的输出?

时间:2015-04-01 14:10:49

标签: c sqrt

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

double hypotenuse( double side1, double side2 );

int main( void )
{
    double a, b;

    printf( "Enter the values of the two sides: " );
    scanf( "%f %f", &a, &b );
    printf( "\nThe length of hypotenuse is: %f", hypotenuse( a, b ) );   

    getchar();
    getchar();
    return 0;
}

double hypotenuse( double side1, double side2 )
{
       double c;

       c = (side1 * side1) + (side2 * side2);
       return sqrt( c );
}

当我使用float a, b;代替double a,b;时,上述程序有效。为什么呢?

2 个答案:

答案 0 :(得分:4)

在您的代码中,您使用

scanf( "%f %f", &a, &b );

%f用于float,而不是double。试试%lf。{/ p> double

答案 1 :(得分:1)

对于scanf(),说明符"%f"需要float *参数,而不是double *

double a;
//           v--- &a is type double *, scanf("%f" expects float *
scanf( "%f", &a );

要在double中进行扫描,请使用需要"%lf"参数的说明符double *

double a;
//            v--- &a is type double *
scanf( "%lf", &a );

详细信息:scanf()的参数是地址,其中scanf()可以存储结果。 float *double *不同。

使用printf(),数字参数是要打印的。由于printf()采用可变数量的参数,因此它们会通过常规促销活动,例如floatdouble。因此printf("%f", some_float)printf("%f", some_double)可以使用相同的格式说明符。 常规促销不适用于&a&b scanf(),因为这些参数是指针(地址),而不是算术值。


注意:一定要检查scanf()结果。不需要"%lf""%lf"之间的空格,因为"%lf"本身会消耗领先的空白区域,但通常在视觉上更容易理解。

if (2 != scanf( "%lf%lf", &a, &b )) Handle_Error();