游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7154|回复: 20

90后程序MM大战众老程序

[复制链接]

2

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
发表于 2009-12-16 17:13:00 | 显示全部楼层 |阅读模式
故事发生地点: 成都游戏开发圈  (群号42411740)
时间:12月16号下午3点
人物: 开?(90后程序mm),  MartySa ,随风飘, 帝林, kevin, Boyod, 油炸赖疙孢,秦朝天下,|落花?流水|

开? 15:21:18
#include "stdio.h"
main()
{ double a,b,c,d;
printf("ENTER a,b,c:\n");
scanf("%lf%lf%lf",&a,&b,&c);
d=(a+b+c)/3;
d=d*10;
d=d+0.5;
d=(int)d;
d=d/10;
printf("d=%f",d);
getch();

}瞧一下错在哪里,可以运行,但结果不对,
Boyod 15:22:10
你要干什么?
|落花?流水| 15:22:27
%lf是什么?
开? 15:22:38
我的这个错误了,你说错在哪里,结果,双精度啊
开? 15:31:08
错在哪里请指教
Boyod 15:34:12
你要干什么?
开? 15:35:03
我编的这个有错,运行的结果不对,你帮我找一下
秦朝天下 15:35:45
这个程序,自己调试下,就知道了

开? 15:36:00
我调了,结果不对啊
秦朝天下 15:37:13
会不会是在类型隐型转化出了问题,数据截断了
开? 15:37:31
可是这格式是对的啊,
Boyod 15:37:34
不知道你先干什么,有时候也会使用异常来得到自己想要的数字的
开? 15:39:23
晕你说的是什么话啊,你能解决不?
Boyod 15:40:40
你拿程序出来,你到底要实现什么功能?
开? 15:41:56
你瞧了程序,你还不知道它的功能吗??你不会没读懂吧。
开? 15:47:44
转化有错,但是我找不到错在哪里
Boyod 15:48:07
你要得到什么
Boyod 15:48:14
晕死
开? 15:48:24
得到正确的结果啊
Boyod 15:48:28
。。。。。。。。。。
Boyod 15:48:31
郁闷死
Boyod 15:48:47
看你是个小妞的,咱有耐心
Boyod 15:49:02
你用文字描述一下你要得到什么
开? 15:49:16
你读懂我的程序没有嘛,我的要求全在里面了,你又不会还问,
开? 15:49:34
你读懂了的话,你就明白会是什么结果
开? 15:50:09
这是新手程序,你都读不懂的话,说明你没学
Boyod 15:50:57
。。。。。。不知道你想干什么
Boyod 15:51:10
就算叫你写程序,总有个要求吧
开? 15:51:36
晕死了,你瞧我的程序没有?
Boyod 15:52:14
当然看了
开? 15:52:43
瞧了的话,你还不明白我的要求?我的要求用程序写上了,你读懂我的程序,你就明白这个程序是做什么的,就是我的要求,
Phecda 15:53:09
小妞 就是好啊
Phecda 15:53:15
还特殊照顾她
Boyod 15:53:24
。。。。
开? 15:53:43
我以为我是新手,原来有人连新手的程序都读不懂
开? 15:54:16
这么多人都没人懂?神仙啊
Boyod 15:54:39
d=(int)d;
Boyod 15:54:43
这句有问题
开? 15:54:51
问题在哪里?

开? 15:54:58
要那样换?
Boyod 15:55:00
把一个整型赋给一个浮点
开? 15:55:54
这句话的目的就是要把浮点转成整型
Boyod 15:56:07
但是d的类型是浮点
开? 15:56:55
对啊,没错啊,
Boyod 15:56:56
你转换完不要再赋值给d

Boyod 15:57:07
赋过去,又变成浮点了
开? 15:57:08
为什么不可以
Boyod 15:58:47
(int)d是拿到d的整型部分,不是把d变成整型
Boyod 15:59:28
你要了解,就先int f,  f=(int)d;
Boyod 15:59:33
然后d=f;
Boyod 15:59:42
看看中间有没有变化
开? 16:01:37
(int)d就是把D变成整形
Boyod 16:01:56
将整型数据赋绐单、双精度变量时,数值不变,但以浮点数形式存储到变量中,如将23赋值绐float变量f,即f=23,先将23转换成23.00000,再存储在f中。如将23赋绐double型变量d,即d=23,则将23补足有效位数字为23.00000000000000,然后以双精度浮点形式存储到d中。
秦朝天下 16:02:18
那么小啊,我认识的都是70后的程序员
Boyod 16:02:51
(int)d不是把D变成整形
Boyod 16:03:11
而是取整数部分
开? 16:03:18
是的,这句话在别的程序一直在用
开? 16:03:40
不是取整
Boyod 16:04:11
(男人)开?
Boyod 16:04:21
意思就是,我当你是个男人
Boyod 16:04:27
其实你依然是个女人
包子 16:04:33

开? 16:05:34
唉,真是无语,那你说,那样才能把双精度变成整形?
油炸赖疙孢 16:05:59
失精就变了
开? 16:06:17
如何失精啊,你当没说
Boyod 16:06:21
没法变的,只能取整
油炸赖疙孢 16:06:34
放大在缩小
油炸赖疙孢 16:07:05
我都不知道她想实现个什么东西
Boyod 16:07:13
我也是啊
油炸赖疙孢 16:07:16
杨总你真有耐心
Boyod 16:07:26
。。。。。
Boyod 16:07:36
大熊猫啊
Boyod 16:07:38
要保护
油炸赖疙孢 16:07:56
额。。。
油炸赖疙孢 16:08:19
反正我没耐心
Boyod 16:08:32
呵呵
油炸赖疙孢 16:09:21
貌似他这个问题真的要追究,得去看浮点数和整型的差异,
油炸赖疙孢 16:09:29
要去看那种理论书
开? 16:09:32
你们真菜,好吧我给你们说吧,输入3个双精度数,要求平均值,并保小数点后一位数。对第二位数进行四舍五入,这下明白了吗,唉,还要我说
油炸赖疙孢 16:09:55
你要做小数的东西吗,干嘛要转换成整数。。。
Phecda 16:10:01
这女的不一般 这不是一般女的
Phecda 16:10:05

开? 16:10:11
那你说说你那样做?你就会吹?
油炸赖疙孢 16:10:14
四舍五入你不会放大在缩小啊
开? 16:10:20
有本事解题啊
包子 16:10:28
噗。。。
油炸赖疙孢 16:10:35
强制转换回舍弃小数部分
开? 16:10:44
你没瞧到我放大了吗,
开? 16:10:57
但是要舍弃小数部分
油炸赖疙孢 16:11:05
我是新手,潜了
包子 16:11:20

开? 16:11:25
神吹都会,一解题没一个人会,
kevin 16:12:23
程序时错的。

开? 16:12:48
错在哪里?
kevin 16:13:09
d=d+0.5;
会导致第一位小数产生进位
kevin 16:13:49
比如平均 1.265 =》 12.65 =》 +0.5 变成 13.05 le .
kevin 16:14:28
第一位小数2变成3了, 所以结果不对
kevin 16:15:07
哦, 不对, 我好想没看清你的题。
kevin 16:15:09
呵呵
开? 16:15:21
就是要这样的
开? 16:15:24
没错
开? 16:15:49
进位最后不是除10了吗
Boyod 16:16:11
d/10.0
开? 16:16:22
是转型错了,但是我找不错在哪里,那句话别的程序一直在用没错的
油炸赖疙孢 16:16:38
d=(int)d;
Boyod 16:16:51
试试d/10.0
油炸赖疙孢 16:16:51
你去看看这个后d是什么类型
Boyod 16:17:12
d=d/10.0
开? 16:17:14
d=(int)d;这句话错了
kevin 16:17:17
比如第一步运算是1.265 你希望是 得到什么结果呢?
kevin 16:17:27
1.30 吗?
开? 16:17:33

包子 16:18:39
d=d*100;
d=(int)d;
d=d/100;
MartySa 16:19:24
用 >> 和 & 判断小数点后第2位的值
MartySa 16:19:36
何必这么复杂
开? 16:19:52
不行,我就要用这种算法
Phecda 16:20:08

Phecda 16:20:12
固执的女女
MartySa 16:20:12
double的内存分布去研究研究就对了
开? 16:20:18
唉,都不懂
包子 16:20:24
实在没明白+0.5的意义。。。凑数字么?
Boyod 16:20:31
四舍五入
包子 16:20:35
噗。。。
开? 16:20:37
这是算法
包子 16:20:48
哎。。。你们继续吧
开? 16:20:57
不给你说你又不懂
kevin 16:21:12
那程序应该是对头的。
MartySa 16:21:21
写算法,你自己实现一个  class youdouble;
开? 16:21:26
是了,运行的结果是不对的啊
kevin 16:21:34
你不如说你的输入和输出。
MartySa 16:21:35
思路为大数加减法
kevin 16:21:43
大家看看结果
开? 16:22:09
你运行了吗?
MartySa 16:24:16
d=d*100;
d=(int)d;
d=d/100;
d会丢失精度 int截断
Boyod 16:24:21
程序应该没问题啊
kevin 16:24:31
我觉得你可能没把自己的意图弄清楚: 保留2位小数, 第2位四舍入, 那么第二位应该参考第三位的值。
比如:
1.26512345 = 1.27 , 你算出是1.30
1.25411100 = 1.25, 你算出是1.25
Boyod 16:24:34
是不是printf的时候没注意保留几个小数
MartySa 16:26:11
double可以伪看为int的子类,在默认拷贝构造时X = (int)X,丢失子类行为
Boyod 16:26:53
善哉
油炸赖疙孢 16:27:11
貌似是他只入,没有舍
油炸赖疙孢 16:27:43
+0.5肯定会入,
MartySa 16:28:10
一直找不到内置类型具体实现的资料 也是瞎猜
油炸赖疙孢 16:28:29
1.2按他实现是1.0,但是用他的那个就变成2.0了
开? 16:29:56
这样说吧,本来是,211324。553这个双精度数,一转型变了如145这么大个数,不知错在哪里
随风飘 16:30:40
浮点数,在计算机里,是不能表示所有连续小数的。。

有些数根本表示不了,只能近似。
Boyod 16:32:18
211324.553是第一次求和的结果吗?
开? 16:32:54
好向数字不要太大可以有正确的结果,多了就不行
Boyod 16:33:13

kevin 16:33:15
太大是好大?
kevin 16:33:28
超过2亿了吗?
随风飘 16:33:32
你们真菜,好吧我给你们说吧,输入3个双精度数,要求平均值,并保小数点后一位数。对第二位数进行四舍五入,这下明白了吗,唉,还要我说

k=(a+b+c)/3  //但是这里a+b+c可能溢出。


开? 16:34:03

说得对啊
开? 16:34:16
不对不对
开? 16:34:32
加了之后结果还是正解的,
开? 16:34:46
只是转型时错了
随风飘 16:34:53
并保小数点后一位数。对第二位数进行四舍五入

至于这句很简单,k+0.05就行了。
如果你要精确的,那么就不能用浮点类型去表示。
随风飘 16:35:40
我记得,在计算机里,1.35还是1.45这种数就不存在。。
Boyod 16:35:49
溢出了
随风飘 16:36:27
他说加起来还对,那就是没溢出呢。但是这个加法必须每一步都判断是否溢出。
Boyod 16:36:41
scanf("%lf%lf%lf",&a,&b,&c);

211324.553
211324.553
211324.553
d=(a+b+c)/3;
(gdb) p d
$1 = 9.1227264201882165e-307
kevin 16:38:12
程序原理是对的, 太大出错那就是溢出了。
开? 16:38:17
我明白了,好几最大只能表达9位数
Boyod 16:38:56
稍等
随风飘 16:39:17
浮点数的精度损失,有两方面,一方面是表示的范围,另一方面,就是有些小数计算机不能表示,只能表示成近似值。
Boyod 16:39:24
Linux下面结果是对的
Boyod 16:39:38
211324.553
211324.553
211324.553
6        d=(a+b+c)/3;
(gdb) p d
$1 = 9.1227264201882165e-307
(gdb) n
9        d=d*10;
(gdb) p d
$2 = 211324.55300000001
(gdb) n
10       d=d+0.5;
(gdb) p d
$3 = 2113245.5300000003
(gdb) n
11       d=(int)d;
(gdb) p d
$4 = 2113246.0300000003
(gdb) n
12       d=d/10;
(gdb) p d
$5 = 2113246
MartySa 16:40:42
dtemp = (d1+d2+d3)/3
dtemp = (dtemp *100+0.5)/(double)100
printf("%.2f", dtemp )
要保证不能溢出
Boyod 16:41:00
找到地方了应该是      d=d+0.05;
Boyod 16:41:25
一下午就毁在mm手上了
随风飘 16:41:44
汗,你们就这样花了一下午啊。。
Boyod 16:42:36
#include "stdio.h"
main()
{ double a,b,c,d;
printf("ENTER a,b,c:\n");
scanf("%lf%lf%lf",&a,&b,&c);
d=(a+b+c)/3;
d=d*10;
d=d+0.05;
d=(int)d;
d=d/10;
printf("d=%f",d);
getch();

}
开? 16:42:41
为什么你运行那么大的数还没有错,我只要运行大一点就有错?
随风飘 16:43:44
d=d*10;这是为什么??
Boyod 16:44:03
你是在dos下面?
MartySa 16:44:14
进位塞
MartySa 16:44:24
*100 就 + 0.5
随风飘 16:44:35
我知道进位,我意思是为什么要进位?
开? 16:44:53
我的是在DOS下面
随风飘 16:44:54
她只是要求平均数再四舍五入罢了。
MartySa 16:44:58
这就是算法的思想
MartySa 16:45:06
自己悟
随风飘 16:45:09
哦。。要把后面的全归零。。
MartySa 16:45:16

kevin 16:45:49
dos下边 int 最大32767
开? 16:45:55
不行啊,我运行123。568这么大的数没错,但是一运行,2332633。1223这么大的数就错了
随风飘 16:46:08
浮点数,进行乘除之后,精度就已经损失了。。。
MartySa 16:46:18
dos下int几个字节?
开? 16:46:23
搞半天明白了
kevin 16:46:24
超过32767 这句 d = (int)d; 就溢出了。
随风飘 16:46:44
kevin<kevin_goal@qq.com>  16:45:49
dos下边 int 最大32767

turbo c那个时代int都是16位的。。
开? 16:46:46
那为什么你的能算对呢
随风飘 16:46:56
我们不是在dos或者tc下面。。
MartySa 16:47:10
32位操作系统的嘛
kevin 16:47:15
他的是32位的, int可以表示20多亿
kevin 16:47:20

随风飘 16:47:26

MartySa 16:47:50
2的32次方-1 你自己算算吧
kevin 16:48:08
看来你提问很整人啊, 因该这样提问:
1.  操作系统+开发环境
2. 程序源码。  输入, 输出结果。
kevin 16:48:28
否则神仙也帮不鸟了。
随风飘 16:48:31
主要是她的开发环境太奇怪了。。
开? 16:48:41
我刚学行
随风飘 16:48:42
现在谁还用那玩意啊。
开? 16:48:51
用的是C语言
随风飘 16:48:56
我们学的时候也是从vc6.0开始的啊。。
开? 16:49:25
C语言不是只能在DOS下面运行吗,还能在别的环境运行?
随风飘 16:49:29
c语言也有环境的,现在很少有需要在16位操作系统或者很古老的编译器下面工作了。
随风飘 16:49:32
显然,。。。
Boyod 16:49:34
程序小mm 搞乱一帮老程序,哈哈
随风飘 16:49:37
vc都能编译c
Boyod 16:49:54
我这边也是32位的Linux,根本看不出来问题
开? 16:50:20
那这么说开发用C语言的人都没有???
Boyod 16:50:28
就是C啊
随风飘 16:50:29

Boyod 16:50:36
不同的机器也不一样的
随风飘 16:50:44
vs2005就能编译c语言啊。
Boyod 16:50:51
有时还分大端小端的
开? 16:50:53
32位?
随风飘 16:50:55
我刚才这个代码不就是c么。。
随风飘 16:50:57
对啊。。
MartySa 16:50:59
具体看操作系统了
随风飘 16:51:15
谁告诉你c只能在16位或者说dos环境下用呢?
MartySa 16:51:21
不是看IDE
开? 16:51:32
因为我发现我现在一直在DOS下面用
随风飘 16:51:32
汇编语言都可以在32位环境下用。
MartySa 16:51:58
** 要跟上时代
随风飘 16:52:46
MartySa(93066194)  16:51:21
不是看IDE

我说的是编译环境vs不仅仅是一个ide。。。

不同的编译器对int的约定不一样。

你在xp x86下用非32版本的turbo c一样int 是16位的。

你甚至可以在编译器里把默认int的位数变了。
帝林 16:53:28
砝码
MartySa 16:53:54
你在16位上能写32位的么
MartySa 16:53:58
这是我的疑惑
帝林 16:54:12
顶替
Boyod 16:54:18
32位上都可以整64位
MartySa 16:54:20
编译器是可以改的哈
帝林 16:54:20
顶替
Boyod 16:54:25
可以自己写个类来处理的
帝林 16:54:31
砝码
随风飘 16:55:12
32位程序还是还是16位程序,是另一个问题。
这里说的是int的默认类型。。。16 32 64这是可调的。主要跟编译器有关。

现在64位环境的int还是32位。。
MartySa 16:55:14
哦,,
开? 16:56:21
学的太少,你们知道的这么多啊
开? 16:56:31
你们是那个学校的?
MartySa 16:56:41
他们是社会大学的
随风飘 16:56:47
社会大学的

MartySa 16:56:48
上学很多年了
kevin 16:57:28
只有 BYTE, WORD, DWORD 是严格意义的 1,2,4字节, 所有的平台开发环境都应该遵守, 其他数据类型都是不定的。

10

主题

173

帖子

178

积分

注册会员

Rank: 2

积分
178
发表于 2009-12-16 17:25:00 | 显示全部楼层

Re: 90后MM大战众老程序

沙?

30

主题

422

帖子

433

积分

中级会员

Rank: 3Rank: 3

积分
433
发表于 2009-12-16 18:54:00 | 显示全部楼层

Re:90后MM大战众老程序

玩得真开心啊

2

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
 楼主| 发表于 2009-12-17 09:55:00 | 显示全部楼层

Re:90后程序MM大战众老程序

顶起

4

主题

46

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2009-12-18 10:26:00 | 显示全部楼层

Re:90后程序MM大战众老程序

这个程序这么看没问题,不过精度数在存储的时候未必能存出想要的结果

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2009-12-22 01:09:00 | 显示全部楼层

Re:90后程序MM大战众老程序

SB的我竟然还看完了。

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2009-12-22 14:24:00 | 显示全部楼层

Re:90后程序MM大战众老程序

MD 我竟然也看完了~~~ 小数字还可以大数字肯定会有问题啊,浮点表示范围大多了,何况32位环境下double还是64位的....应该用modf吧?

2

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
 楼主| 发表于 2009-12-26 17:50:00 | 显示全部楼层

Re:90后程序MM大战众老程序

up

2

主题

37

帖子

37

积分

注册会员

Rank: 2

积分
37
 楼主| 发表于 2010-2-9 17:06:00 | 显示全部楼层

Re:90后程序MM大战众老程序

up

0

主题

10

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2010-2-20 00:25:00 | 显示全部楼层

Re:90后程序MM大战众老程序

极品MM:)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-10 13:51

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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