Почему `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();