找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月

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

[复制链接]
发表于 2013-9-14 23:11:39 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑 : b( W; I( }% k. L1 E0 ^
' j8 p4 m4 ?9 O0 b, E

, ]5 e7 M& i) W! r  j" [+ f4 i! J6 ^$ F) f0 g& B  _, {
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。5 @& v5 C/ H4 b
假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?% s8 i0 [- t: ~; E2 H* f

- X$ M  ]- P) b/ P/ Q假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:4 _% o$ E0 ?$ X# L
$ x7 ~7 n1 n' w) F0 e$ I
int a=0, b=0, c=0;
& w: U) ^1 C2 I9 Pwhile ( a<360 )
$ o* j1 B: M4 z2 w4 _! a{
" i- M0 S6 O2 ?8 N/ {" B. V4 Q  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60;
( X$ b* d' ]* R, R  T& |6 P  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60; ! |" U# K- L& [$ [
  a=a+j;
% l: ?$ P" j+ O7 S& z  printf("%d°%d′%d″\n",a,b,c);
# p- z$ O) d: b) D2 y4 @}
# D/ ?7 N$ K9 y' x: V! r) |' n, }) s/ V- B! ]2 U
不妨试一试,看下结果。
: e0 H" C, y% \" M, J. N4 t
7 a4 ?+ T. I$ P# l, z

本帖子中包含更多资源

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

×

点评

有点问题,改正在17楼。  发表于 2013-9-15 10:40
发表于 2013-9-15 08:20:37 | 显示全部楼层
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。. i4 R' ~% N8 k( z( I: m
) \7 X# {- k1 y3 P
楼主程序中的
# {. e" q8 M+ c7 q1 w  Y
, X  a5 f- p, P! o4 Q    int  m=22734;" E2 i6 U0 W+ [* B! |7 a" N

: r1 t9 M9 \5 @8 S6 d该值是做什么用的?该值如何来的?
 楼主| 发表于 2013-9-15 08:22:37 | 显示全部楼层
fmdd 发表于 2013-9-15 08:20
# D+ \+ U1 Z' S% X) l隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...
; t+ L2 D) R8 G" m
取的值,可以变化的。是6°18′54″转化为秒数
  J; `# K& B8 H: X; D( D6 Z" b8 L
发表于 2013-9-15 08:31:22 | 显示全部楼层
本帖最后由 fmdd 于 2013-9-15 08:33 编辑
/ d. o2 R% o2 g, Y/ Q: y/ u& O
昨日明月 发表于 2013-9-15 08:22 . r7 F) M! q$ J& d3 L
取的值,可以变化的。是6°18′54″转化为秒数

% T1 w4 h  b+ x* z2 [$ X7 t3 V这个取值本身就损失了精度, G# a6 ]6 S& a5 h0 I- @4 U

. t1 b; C. C, C3 x6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°
  n2 \6 C1 X+ }% S8 D9 D
4 c5 i+ @1 e% {/ ]( B这里的精度损失造成了最后累加数值偏差。
$ T' [7 @/ a/ {9 `$ k5 n0 q2 y
 楼主| 发表于 2013-9-15 08:33:11 | 显示全部楼层
fmdd 发表于 2013-9-15 08:31 ; r, y( \# y. B
这个取值本身就损失了精度
# B/ n, b% v( z' b/ W2 r! h1 S; m$ k3 W. k
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...

3 y$ `1 h* M+ ?, V老式铣床精度要求没那么高。。。 达到秒数就够了。。。) @9 Q- U& c- `5 M$ v3 w5 `+ l
 楼主| 发表于 2013-9-15 09:03:58 | 显示全部楼层
逍遥处士 发表于 2013-9-14 23:11   Y7 t' _% p$ b' _
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。( O9 K0 i9 W* |+ ~+ Q9 H  \# b
假如齿数 ...
  e/ V; q4 D8 W5 `
按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

×

点评

搞错了。应该把 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 | 显示全部楼层
把那两行改成这样试一试:
  _5 _' x; ~0 O$ ]if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; , i+ i$ ?) D( W& f* d. O
if ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
 楼主| 发表于 2013-9-15 11:42:32 | 显示全部楼层
逍遥处士 发表于 2013-9-15 10:41 ' a/ p4 a/ O" y( \( M5 i
把那两行改成这样试一试:
: G4 P4 H9 E0 uif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; # Y& r" m$ W& \- _* x6 d
if ( (b+f)>=60 )  a=(b+f)/60;  ...

& k1 t9 I" @$ h1 A* N& Y$ `& r改后是这个结果,也不行。

本帖子中包含更多资源

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

×
发表于 2013-9-15 11:57:54 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑
; [6 t. U& K( z$ S# ]% M+ K
昨日明月 发表于 2013-9-15 11:42
! C* n5 o$ F* D7 `* `+ h/ U) j, h改后是这个结果,也不行。
1 W. p+ b; q6 e! O+ I) _
3 f8 M( q; W9 I9 f5 j# t% T
漏掉了一个 号,哈哈!
4 C0 u" m& M* |$ k吾宝刀未老也!4 w7 r5 p2 Q7 y) G) I  \2 C2 t) ]
  f' ^0 v1 ^; n+ P

本帖子中包含更多资源

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

×

点评

三分写,七分试。  发表于 2013-9-15 12:02
这次整对了。谢谢逍遥前辈。  发表于 2013-9-15 12:01
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-7-4 12:10 , Processed in 0.067434 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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