Сумма n членов дробного выражения является целым числом, когда оно должно быть числом с плавающей запятой.

В следующем коде, почему я не получаю правильный результат, если я не поставлю term = 1.0/n, а не когда term = 1/n. Я объявил термин как плавающий. Разве этого недостаточно?

#include <stdio.h>

int main()
{    
     float sum = 0, term;
     int n, i;
     
     printf("enter the value of n:\n");
     scanf("%d", &n);
     term = 1.0 / n;
     for(i = 1; i <= n; i++)
     {  
        sum = term + sum; 
       
      }
     printf("Sum = %.3f\n", sum);   
     
     return 0; 
}

person adi99    schedule 19.03.2020    source источник
comment
Поскольку 1 является int, а также n, вы получаете целочисленное деление. Использование 1.0 приводит к делению с плавающей запятой.   -  person Johnny Mopp    schedule 19.03.2020
comment
Чего вы пытаетесь достичь? Суммируя 1/n, n раз, вы получите 1. Хотите 1 + 1/2 + 1/3 .. + 1/n?   -  person Ashwani    schedule 19.03.2020
comment
Я подозреваю, что вы хотите суммировать 1/i (или, скорее, 1.0/i в C).   -  person Ian Abbott    schedule 19.03.2020
comment
Правая сторона выражения term = 1/n является целым числом. Тип LHS не имеет значения при оценке RHS.   -  person William Pursell    schedule 19.03.2020


Ответы (1)


В следующем коде, почему я не получаю правильный результат, если я не поставлю term = 1.0/n, а не когда term = 1/n. Я объявил term как float. Разве этого не должно быть достаточно?

К сожалению нет.

ISO/IEC 9899:2017 §6.5.5 6 гласит:

Когда целые числа делятся, результатом оператора / является алгебраическое частное с отбрасыванием любой дробной части.105) Если частное a/b представимо, выражение (a/b)*b + a%b должно быть равно a [...]

105) Это часто называют усечением в сторону нуля.

Перевод: результатом этого деления двух целых чисел является целое число.

Даже если вы присвоите его переменной float или double, этого недостаточно, он будет усечен до того, как будет назначен, решение - превратить один из операндов в дробном выражении в число с плавающей запятой или двойное число, как вы сделали.

person anastaciu    schedule 19.03.2020