鱼C论坛

 找回密码
 立即注册
查看: 2098|回复: 15

关于小甲鱼c语言35课的一个问题

[复制链接]
发表于 2015-2-6 20:37:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 bangiao 于 2015-2-6 21:03 编辑

QQ截图20150206201111.png

源代码

源代码




QQ截图20150206201609.png

为什么会出现这种问题???

这是源代码:
#include<stdio.h>
void  main()
{
        double a = 49.0, result;
        double sq(double x);
        result = sq(a);
        printf("%.2f", result);

}
double sq(double x)
{
        double i = 0.0;
        for (i = 0.0; 1; i += 0.1)
        {
                if (x == i*i)
                {
                        break;
                }
        }
        return i;
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-2-6 20:48:35 | 显示全部楼层
本帖最后由 haiouda 于 2015-2-6 20:51 编辑

if (x==i*i)
中的 ‘x’,在哪定义的? 形参,可以直接做变量来用~?!?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-6 21:00:16 | 显示全部楼层
haiouda 发表于 2015-2-6 20:48
if (x==i*i)
中的 ‘x’,在哪定义的? 形参,可以直接做变量来用~?!?

形参!在
double sq(double x)
被定义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-6 21:00:59 | 显示全部楼层
haiouda 发表于 2015-2-6 20:48
if (x==i*i)
中的 ‘x’,在哪定义的? 形参,可以直接做变量来用~?!?

可以吧!!!{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-6 21:09:18 | 显示全部楼层
本帖最后由 haiouda 于 2015-2-6 21:27 编辑

帮我看下,为什么不进入 for 循环呀???  这是哪错了,for ,直接跳过???
#include <stdio.h>

void main()
{
        double a =4.0,result;
        double sq(double x);
        result = sq(a);
        printf("%2.15f\n",result);
}

double sq(double x)
{
        double i =0.0;
        for (i=0.0; 1;i+=0.1)
        {
                if(x==i*i);
                {
                break;
                }
        }
        return i;

}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-6 21:18:14 | 显示全部楼层

是可以,我刚学完这,习题还没做。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-6 22:01:47 | 显示全部楼层
haiouda 发表于 2015-2-6 21:09
帮我看下,为什么不进入 for 循环呀???  这是哪错了,for ,直接跳过???

额!看了半天终于知道了!if()后面多了个;号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-6 22:03:23 | 显示全部楼层
@小甲鱼   老师!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-6 22:04:20 | 显示全部楼层
因为浮点数在计算机中不能被精确表示,所以会出现这种问题。循环变量一般是禁止使用浮点数的,会出很多不可预知的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-6 22:08:01 | 显示全部楼层
gyedkbvo 发表于 2015-2-6 22:04
因为浮点数在计算机中不能被精确表示,所以会出现这种问题。循环变量一般是禁止使用浮点数的,会出很多不可 ...

额!那就麻烦了!!!只能用1了么?
没有更好的办法了么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-6 22:10:03 | 显示全部楼层
你把循环for (i=0.0;1;i+=0.1)改成for (i=0.0;i==1.0;i+=0.1)试验一下就知道了,循环也不会结束,因为i==1.0不能被精确表示,所以会死循环。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-6 22:14:10 | 显示全部楼层
bangiao 发表于 2015-2-6 22:08
额!那就麻烦了!!!只能用1了么?
没有更好的办法了么?

具体浮点数为什么不能精确表示,请查阅IEEE754标准
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-6 22:16:07 | 显示全部楼层
bangiao 发表于 2015-2-6 22:08
额!那就麻烦了!!!只能用1了么?
没有更好的办法了么?

#include<stdio.h>
void  main()
{
        int a = 4, result;
        double sq(int x);
        result = sq(a);
        printf("%d\n", result);
       
}
double sq(int x)
{
        double i = 0.0;
        int y;
        for (i = 0.0; 1; i += 0.1)
        {
       
               
                if (x ==(y=i*i))
                {
                        break;
                }
        }
        return i;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-2-6 22:20:27 | 显示全部楼层
haiouda 发表于 2015-2-6 22:16
#include
void  main()
{

哎!不能愉快的完成作业了!!!
 if (x < i*i)
我把它改成这个了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-6 22:22:12 | 显示全部楼层
bangiao 发表于 2015-2-6 22:20
哎!不能愉快的完成作业了!!!

我把它改成这个了

这是什么作业呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-2-7 14:59:59 | 显示全部楼层
计算机里浮点数不精确的,稍有偏差正常:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 15:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表