机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月

求解一个C语言程序功能是每隔6°18′54″就增加6°18′54″并输出结果的程序问题。

[复制链接]
发表于 2013-9-14 23:11:39 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑
- t# |% J* T* ]- M5 F/ e. R: }7 ]+ u0 Z+ g. \8 J

$ g7 M: q% S1 t* q, [) H
* h& Q+ z0 o& j5 k这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。  C& Y8 }' t* z: W' Q5 B
假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?
$ n* p. e0 ~: d4 E) J4 ?; d* e7 A: f8 U9 c9 \) Q7 e% u! q
假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:
7 a$ O! S8 Z! m3 N5 C; i  Q
' d6 @0 Q) ]0 yint a=0, b=0, c=0; % j! i1 E& Y) K% e8 A# i# ^. D
while ( a<360 )  v  ]5 t" h8 ?, L; l
{" ~( G) [4 L# L& z, Y+ l8 }7 J
  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60;
# Z* o# m( z7 r3 E  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60;
" O( C& N' i1 v8 }  a=a+j;6 `$ J# k; d, `% V. r- X
  printf("%d°%d′%d″\n",a,b,c);* g  C4 P3 n7 N- t: i- Y* ^  _3 f, j
}6 H" z% }! A3 K9 u
- L# f1 n/ ]$ _8 w
不妨试一试,看下结果。* `8 \" e* s+ R& }9 G
- X) Q' ?  V  h$ X  F  c- |; ?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x

点评

有点问题,改正在17楼。  发表于 2013-9-15 10:40
回复 支持 反对

使用道具 举报

发表于 2013-9-15 08:20:37 | 显示全部楼层
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。
5 Y/ D5 @0 E( e0 d7 W9 }$ k) V& w/ o6 m6 T( M5 r
楼主程序中的
; D2 T3 U8 q  ~# N& j  T
0 K2 w! p; f  |/ F    int  m=22734;
  \6 y( b6 D+ N5 u4 T& o. X$ s- l8 k7 k
该值是做什么用的?该值如何来的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 08:22:37 | 显示全部楼层
fmdd 发表于 2013-9-15 08:20 ) W9 Q4 u" a! {. I1 a4 B/ T
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...

5 r9 W) v( f: `: c! v) ^取的值,可以变化的。是6°18′54″转化为秒数! B* l& l/ y: ?3 K
回复 支持 反对

使用道具 举报

发表于 2013-9-15 08:31:22 | 显示全部楼层
本帖最后由 fmdd 于 2013-9-15 08:33 编辑 7 z' I% _# N1 ^9 w, m
昨日明月 发表于 2013-9-15 08:22 ' g! `5 t$ G8 u2 C9 n+ G
取的值,可以变化的。是6°18′54″转化为秒数

7 X! L& I' S: V4 N- n" Y这个取值本身就损失了精度
* o# B( I$ b# Y' f0 J: x2 }4 ^8 z2 K7 M& |6 F  z( l
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°. e. \  m0 V! }( k

' R' B+ x5 O' E这里的精度损失造成了最后累加数值偏差。7 p0 D) @( f0 t6 Z* D8 y
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 08:33:11 | 显示全部楼层
fmdd 发表于 2013-9-15 08:31 7 f' k/ I" g- m
这个取值本身就损失了精度
6 {6 n. l" f0 O- Y6 T+ F* L& ~$ ~9 B* D
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...
% V" V5 G1 u6 ~7 z8 [
老式铣床精度要求没那么高。。。 达到秒数就够了。。。& G1 ?, s8 p0 c
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 09:03:58 | 显示全部楼层
逍遥处士 发表于 2013-9-14 23:11 ) S" |  n2 v) I1 c- U0 Z$ O
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
5 R1 q3 X% F: n假如齿数 ...

& @* }) Z) K# G: }按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x

点评

搞错了。应该把 if 语句放前面。  发表于 2013-9-15 10:40
回复 支持 反对

使用道具 举报

发表于 2013-9-15 10:39:52 | 显示全部楼层
这是一个很有意思的问题。我也试了以下,结果当i = 5的时候,c 确实等于29。为此,当i = 5的时候,检查 c 取整以后的余数 =1 ,也是一个整数。它就是 c 所差的数,由此,我就怀疑程序本身的内部函数在处理“余数”的问题?!为此,我把6°18′54″化成22734″的数值改成了22734.0001″,结果一切正常。这说明你所编的程序并没有错。请试试看。
回复 支持 反对

使用道具 举报

发表于 2013-9-15 10:41:38 | 显示全部楼层
把那两行改成这样试一试:3 N1 k# `# P3 D% c% |( u6 D
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
6 L- X/ s1 b. t4 _7 E! Xif ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 11:42:32 | 显示全部楼层
逍遥处士 发表于 2013-9-15 10:41
' L/ ~7 N& t; N9 q$ b把那两行改成这样试一试:( e5 C+ o( y/ J6 Q' a9 f
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; # V' I$ g1 |. L* h: `' o1 Z* K
if ( (b+f)>=60 )  a=(b+f)/60;  ...
; E' P: V- D4 B7 E% x, ~" s" F& q) @
改后是这个结果,也不行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
回复 支持 反对

使用道具 举报

发表于 2013-9-15 11:57:54 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑
! [( y$ e$ `9 e. p$ R* L
昨日明月 发表于 2013-9-15 11:42 . Q/ X. S) {' ?( d# w
改后是这个结果,也不行。

1 x: M* Z" \8 u2 e/ Z3 Y6 E& U7 ^7 i) m* I. m9 c7 o& v# F4 Z( g
漏掉了一个 号,哈哈!! b: [+ I3 s2 n9 S. W0 I
吾宝刀未老也!
! {1 H3 ~% k6 {( s' {1 R8 j6 e: ?1 V( W: Y

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x

点评

三分写,七分试。  发表于 2013-9-15 12:02
这次整对了。谢谢逍遥前辈。  发表于 2013-9-15 12:01
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

小黑屋|手机版|Archiver|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-1-11 20:48 , Processed in 0.066059 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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