%ld
должен получить long int
в качестве аргумента, а не double. Попробуйте %f
, %e
, %g
, с дополнительными модификаторами на ваш выбор или другие форматы, поддерживаемые printf
.
Кроме того, вы должны рассмотреть возможность включения предупреждений компилятора, например -W -Wall
с g cc:
: In function 'main':
:10:5: warning: format '%ld' expects argument of type 'long int', but argument 2 has type 'double' [-Wformat=]
printf("float is %ld \ndouble is %ld", a, b);
^
:10:5: warning: format '%ld' expects argument of type 'long int', but argument 3 has type 'double' [-Wformat=]
Аргументы имеют тип double
, поскольку float
повышается при использовании с функцией varargs, такой как printf
.
В вашем примере вычисления в основном одинаковы: оба вычисления H / (2 * Pi)
выполняются как float, и после этого результат преобразуется в double
: в одном случае, поскольку b
равен double
, а в другом случае из-за правил продвижения на printf
.