While循环中的0.1增量(C编程)

While循环中的0.1增量(C编程),c,while-loop,increment,tabular,C,While Loop,Increment,Tabular,我在上C编程入门课。我们最新的项目让我们编写代码,用while循环将x和sqrt(x)值从1-10以0.1的步长制成表格。但是,当我尝试执行0.1增量时,没有向起始整数1添加任何内容,程序在无限循环中运行。我将在下面发布代码。除了不执行该步骤外,程序运行良好(并与其他增量一起工作,如1等)。我如何解决这个问题 #包括 #包括 内部主(空) { int x=1; 双平方米; printf(“平方根表:\n”); printf(“X的X平方根的值”); 而(xintint类型只允许存储整数(即-2、

我在上C编程入门课。我们最新的项目让我们编写代码,用while循环将
x
sqrt(x)
值从1-10以0.1的步长制成表格。但是,当我尝试执行0.1增量时,没有向起始整数1添加任何内容,程序在无限循环中运行。我将在下面发布代码。除了不执行该步骤外,程序运行良好(并与其他增量一起工作,如1等)。我如何解决这个问题

#包括
#包括
内部主(空)
{
int x=1;
双平方米;
printf(“平方根表:\n”);
printf(“X的X平方根的值”);

而(xint
int
类型只允许存储整数(即-2、-1、0、1、2等)。要存储带小数点的数字,需要使用双精度(或
double
)类型。将
main()
的第一行更改为:

double x = 1.0;

如果您尝试将
1e-1
添加到
int
,它将首先将其转换为
int
,即
x
的类型,该类型在被截断时将最终为零,因此您永远不会在程序中读取的行中实际添加任何内容

x += 1e-1;
执行操作是否等同于

x = (int)(((double)x) + 0.1);
换句话说,x首先转换为一个
double
,然后向其添加0.1,得到1.1。然后将该值转换为
int
,得到一个值1,该值分配给x

解决方法是将
x
的类型更改为浮点类型,例如
float
double


分享和享受。

以下代码是关于如何执行所需算法的建议

#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
#包括
#包括
//定义幻数,不要将它们嵌入代码中
#定义上限(10.0)
#定义步长(0.1)
内部主(空)
{
双x=1.0;
双平方米;
printf(“平方根表:\n”);
printf(“X的X平方根的值”);
//由于“真实”值的模糊性,
//此循环将迭代约90次。
而(x<上限)
{
sq_rt=sqrt(x);
//显示两个双精度值
//注:长浮点转换值
//因为基本数字是双倍的
//注:空格用于与列标题对齐
printf(“%9.6lf%16.13lf\n”,x,sq\u rt);
//以0.1的增量增加基础值
x+=步长;
}//结束时
返回0;
}//结束函数:main

你不能将0.1(一个浮点数)加到整数(
x
)上;声明
x
为一个浮点数:
double x=1;
。是的,你可以。它并不总是做你期望的事情。@MartinTörnwall是的,但我认为对于这个问题,把它保持为“不,你不能”更合理。这是一个完整的答案,可以解释这里发生了什么。那么,我应该如何写呢?因为现在,它在一个无限循环中运行,它只需要取1@Evert:我不同意。说“不,你不能”如果它明确无误地编译,可能会比解释它是合法的,但没有达到预期的效果更容易引起混淆。s/rounded/truncated;)从
1.0
开始,反复添加
1.0
,很可能不会达到
10.0
,这正是由于舍入错误。(也许这就是练习的重点?)@基思·汤普森怀疑你在评论中的意思是“添加
0.1
。@chux:是的。也许我用的是小尾端符号。8-)