机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月

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

[复制链接]
发表于 2013-9-14 23:11:39 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑
3 O8 [. ^5 O% {! p9 ?
! q- d! K. Z) T. ?+ G- G, y: i* d  `' e* {1 _6 ~1 X( w6 C- n. J

& V+ s( W# x. n2 H这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。* t/ o" w1 M1 s% m, G5 F
假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?
: H0 @2 v9 c# E: Q' i0 A# d" }1 g; a
假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:+ X3 f* J2 F3 L. W# [

  W7 G9 N7 y) P! l: Tint a=0, b=0, c=0; , l% j2 i: X& r
while ( a<360 )
% J: H% t% f, R5 m2 S  m{# B3 K3 o/ @2 b& B2 b; G3 p
  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60; % k2 {, k! n3 }1 r
  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60;
( G/ O& \' ~/ o2 M4 Y7 ]# h# Y  a=a+j;
" M( C+ I1 K' P7 P0 F) B9 F  printf("%d°%d′%d″\n",a,b,c);
) X: c% C! Y4 n) G}" W) _7 b# L3 \6 U% h
& A  o1 D' q# _: z! O. c1 T
不妨试一试,看下结果。
1 ~( j0 ~$ l3 q, i( g5 N1 p" I) [4 _, M0 M2 T

本帖子中包含更多资源

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

x

点评

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

使用道具 举报

发表于 2013-9-15 08:20:37 | 显示全部楼层
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。
8 Z) B: C# ?3 L' j! F4 M6 L( e0 m6 Y5 s/ f& ]
楼主程序中的4 j6 c  J+ H+ d. t: Z, {

% p4 J; @7 S& A3 n+ C" V% i. w    int  m=22734;8 T1 v" d' M2 c3 y

2 k9 ^) G6 N$ p/ x' J该值是做什么用的?该值如何来的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 08:22:37 | 显示全部楼层
fmdd 发表于 2013-9-15 08:20 + R# L* J* X, N4 G/ L9 [. Z# Q
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...

8 h$ s, r8 D" t8 I; n7 j取的值,可以变化的。是6°18′54″转化为秒数+ j1 T4 M# q: f2 f% ?8 ]. W
回复 支持 反对

使用道具 举报

发表于 2013-9-15 08:31:22 | 显示全部楼层
本帖最后由 fmdd 于 2013-9-15 08:33 编辑 " P  O, J, P7 T# }5 u
昨日明月 发表于 2013-9-15 08:22 : a: W  B0 N0 c1 X
取的值,可以变化的。是6°18′54″转化为秒数

% q' x3 e$ Y, N1 |这个取值本身就损失了精度
1 Z/ U8 w& Z$ u8 c3 @3 ?( L3 ?" k
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°
9 j4 o! B" j; {3 s9 K* b' ~6 e
这里的精度损失造成了最后累加数值偏差。  l1 O% O7 j# f/ z- R/ t
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 08:33:11 | 显示全部楼层
fmdd 发表于 2013-9-15 08:31 6 ^7 p6 ?( k* @, D- g6 q  N
这个取值本身就损失了精度
  L( u: L2 `: K8 S9 e( s% D! }- `! r( t! M- W' O; g
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...
3 j& p) _9 m5 H" W
老式铣床精度要求没那么高。。。 达到秒数就够了。。。5 G- k: c2 P- W2 p- M( L; a
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 09:03:58 | 显示全部楼层
逍遥处士 发表于 2013-9-14 23:11
+ l5 y  n9 g1 k+ x这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
8 k8 d2 h' ?& F, \4 o" A假如齿数 ...
2 s( Q" n8 Q  J
按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

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 | 显示全部楼层
把那两行改成这样试一试:4 A5 P& c9 W' J- J1 E, h
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
/ X4 T! a+ a1 D1 O" sif ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 11:42:32 | 显示全部楼层
逍遥处士 发表于 2013-9-15 10:41
  q  g. q3 @: N) D把那两行改成这样试一试:
/ {5 _3 K5 i& c  k1 [- Z& z. c9 xif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; % I: Y/ f9 b' B
if ( (b+f)>=60 )  a=(b+f)/60;  ...
6 v) Q4 l- U) @, y  i" H+ {
改后是这个结果,也不行。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2013-9-15 11:57:54 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑
" }: a5 z4 y! w) M5 A8 {
昨日明月 发表于 2013-9-15 11:42 & @# O) h. k* k. k% j
改后是这个结果,也不行。
+ L7 a2 O& Q( p: L- C

' O7 t( i+ @' W. ]1 r4 K漏掉了一个 号,哈哈!4 j2 q; |: }7 _4 e, Z9 @- O
吾宝刀未老也!+ }" I; M" Z3 I% l

# k+ z2 _6 g" {8 `; g' W( D

本帖子中包含更多资源

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

x

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-4 03:06 , Processed in 0.061418 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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