2015-02-12 4 views
-2

Я нахожусь во вводном классе программирования C. В нашем последнем проекте мы пишем код для табуляции x и sqrt(x) значений от 1 до 10 с шагом 0,1 с использованием цикла while. Однако, когда я пытаюсь выполнить приращение 0,1, ничего не добавляется к начальному целому числу 1, и программа работает в бесконечном цикле. Я отправлю код ниже. Помимо того, что он не выполняет этот шаг, программа работает нормально (и работает с другими приращениями, например 1 и т. Д.). Как это разрешить?0.1 приращение в петле While (программирование на С)

#include <stdio.h> 
#include <math.h> 
int main(void) 
{ 
    int x=1; 
    double sq_rt; 
    printf("Square Root Table: \n"); 
printf("Value of X  Square Root of X\n");  
while (x <= 10) 
    { 
     sq_rt = sqrt (x);  
printf("%6i %20f \n", x, sq_rt); 
x += 1e-1; 
    } 
    return 0; 
} 
+3

Вы не можете добавить 0,1 (число с плавающей запятой) в целое число ('x'); объявить 'x' как плавающую точку:' double x = 1; '. – Evert

+5

Да, вы можете. Это не всегда делает то, что вы ожидаете. –

+1

@ MartinTörnwall Да, но я думаю, что для этого вопроса имеет смысл просто держать его в «нет, вы не можете». Было бы хорошо, как полный ответ, чтобы объяснить, что здесь происходит. – Evert

ответ

1

int тип только позволит хранить целые числа (т.е. -2, -1, 0, 1, 2 и т.д.). Для хранения чисел с десятичной точкой вам понадобится тип двойной точности (или double). Измените первую строку main() в:

double x = 1.0; 

Если вы пытаетесь добавить 1e-1 к int, он преобразует его в int первый - типа x - что, когда усеченного будет в конечном итоге к нулю, так что вы Я никогда ничего не добавлю к x.

+1

s/rounded/усеченный;) – Quentin

+0

Совершенно верно! Изменено это спасибо. –

+0

Начиная с '1.0' и многократно добавляя' 1.0', скорее всего, не достигнет '10.0' именно из-за ошибок округления. (Возможно, это и есть смысл упражнения?) –

1

Строка в программе, которая считывает

x += 1e-1; 

выполняет операции, эквивалентные

x = (int)(((double)x) + 0.1); 

Другими словами, х сначала преобразуется в double, а затем 0,1 добавляют к нему, в результате чего в 1.1. Затем это значение преобразуется в int, в результате получается значение 1, которому присваивается значение x.

Исправление состоит в том, чтобы изменить тип x на тип с плавающей точкой, такой как float или double.

Делитесь и наслаждайтесь.

0

следующий код - это предложение о том, как выполнить желаемый алгоритм.

#include <stdio.h> 
#include <math.h> 

// define the magic numbers, don't embed them in the code 
#define UPPER_LIMIT (10.0) 
#define STEP_SIZE (0.1) 

int main(void) 
{ 
    double x=1.0; 
    double sq_rt; 

    printf("Square Root Table: \n"); 
    printf("Value of X  Square Root of X\n"); 

    // due to ambiguities in 'real' values, 
    // this loop will iterate approx. 90 times. 
    while(x < UPPER_LIMIT) 
    { 
     sq_rt = sqrt (x); 

     // display the two double values 
     // note: long float conversion values 
     // because the underlying numbers are double 
     // note: blanks for alignment with column headers 

     printf("%9.6lf  %16.13lf \n", x, sq_rt); 

     // increase base value by increment of 0.1 
     x += STEP_SIZE; 
    } // end while 

    return 0; 
} // end function: main 
Смежные вопросы