Вы ошиблись в нескольких вещах.
Прежде всего, вы используете спецификатор %d
в printf
, но вы передаете ему значение double
; для double
s следует использовать %f
1 , в противном случае printf
попытается интерпретировать байты double
как int
, что приведет к неожиданным результатам (в вашем случае 0).
Обратите внимание, что подобные ошибки обычно замечаются в последних компиляторах с достаточно высоким уровнем предупреждения.
Более того, в ответном заявлении вы написали
1/2 *( pow( (double) n, 2))
Это выражение всегда будет давать ноль из-за фактора 1/2
. И 1
, и 2
являются int
с, таким образом, выполняется целочисленное деление, и, очевидно, это приводит к 0, что убивает все выражение.
Решение: измените 1/2
на 1/2.
(где 2.
обозначает 2 как double
значение, которое переводит операцию в деление с плавающей запятой), или просто замените его на 0.5
, или (еще проще) выполнить деление на два в конце выражения.
<ч />
- Общая информация: у меня всегда было сомнение, что
%f
было для float
, а что-то еще использовалось для double
с; вместо этого оказывается, что для float
s не существует спецификатора, поскольку они автоматически преобразуются в double
s при передаче в функцию в качестве «переменных аргументов» (поэтому это относится к printf
).