Почему `sqrt()` печатает нужный вывод, когда я использую `float`s вместо`double`s?

#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 ответа

Решение

В своем коде вы используете

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

Но %f используется для float не double, Пытаться %lf для double,

За 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() принимает переменное количество аргументов, они проходят обычные акции, такие как float в double, таким образом printf("%f", some_float) а также printf("%f", some_double) может использовать тот же спецификатор формата. Обычные акции не распространяются на &a, &b с scanf() в качестве аргумента указатели (адреса), а не арифметические значения.


Примечание: всегда хорошо проверить scanf() Результаты. Пространство между "%lf" а также "%lf" не нужен как "%lf" само по себе потребляет лидирующие пробелы, но зачастую это визуально легче понять.

if (2 != scanf( "%lf%lf", &a, &b )) Handle_Error();
Другие вопросы по тегам