找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月

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

[复制链接]
发表于 2013-9-14 23:11:39 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑 : p0 Z& c1 x6 u/ h/ j( q; S
6 U6 J% M0 [# I5 t  h4 X5 M

+ n3 X3 |. R# S! a
9 p% z1 P$ K" w. k8 s+ P, J1 r这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
. ^4 N! y7 D, b1 S6 f假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?
  H8 J- Y+ s# \- ]
: v6 Q; _( m; P假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:# K3 s' V. ~1 |2 K7 H4 W" J) {. e
$ B4 }# L' V! ]8 T& |5 F
int a=0, b=0, c=0;
* d2 ~1 T0 k* G% Cwhile ( a<360 )
* \. z1 E+ R# X$ m8 S' t{
6 K$ Z/ Y1 C* C$ M4 x  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60;
5 X4 s- E4 ]' _6 W3 V3 D  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60;
% S# a, z/ c! t6 @  a=a+j;, d+ v/ ?# \( z4 N
  printf("%d°%d′%d″\n",a,b,c);
; B, B: L7 M$ R9 U1 e5 j}
/ Y9 `  k7 @0 I& e) b* c  M1 T$ u; O3 _
不妨试一试,看下结果。6 Z7 D9 H" K6 _! A* ^% ~( P3 R% H

# X$ W0 y. }" B8 v% E  a$ I( X

本帖子中包含更多资源

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

×

点评

有点问题,改正在17楼。  发表于 2013-9-15 10:40
发表于 2013-9-15 08:20:37 | 显示全部楼层
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。
5 ~3 l3 W. _9 c7 Q( }3 T
/ c  K+ P* S, i3 i' K. V" A9 G楼主程序中的% g/ y1 S# V3 m
+ F+ q4 O& ]$ X* j( f4 r$ C1 A
    int  m=22734;' [+ q$ I+ w/ d* }; _) `& @
9 c: t7 P9 V$ n2 f( o
该值是做什么用的?该值如何来的?
 楼主| 发表于 2013-9-15 08:22:37 | 显示全部楼层
fmdd 发表于 2013-9-15 08:20
6 [2 l8 ^# F  |4 u& d隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...

2 j$ ~* V* O( g" c取的值,可以变化的。是6°18′54″转化为秒数
  o! y- h) s0 R/ @+ T3 I
发表于 2013-9-15 08:31:22 | 显示全部楼层
本帖最后由 fmdd 于 2013-9-15 08:33 编辑 , ^1 F! P; S7 W: _  v
昨日明月 发表于 2013-9-15 08:22 " I2 t% ^8 ^( |$ [* W+ Z# D2 \
取的值,可以变化的。是6°18′54″转化为秒数

, W! c# L# U3 z1 \' H这个取值本身就损失了精度2 L% ]3 d0 F! e5 O& v0 S  o& h
0 w1 W' W, [6 Y. y; K
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°
# @' t+ f$ W. T) L2 Y/ }
: E0 I' o; |, @2 T9 F7 z5 ~这里的精度损失造成了最后累加数值偏差。
7 ^1 p0 k6 W7 k) ?' u( `2 g
 楼主| 发表于 2013-9-15 08:33:11 | 显示全部楼层
fmdd 发表于 2013-9-15 08:31
! O+ b- n# q  k+ _" y) q. X这个取值本身就损失了精度2 W' N8 e. o3 E6 y

+ S" Y( f4 }8 |+ R; L" j1 i0 B6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...
7 g  o- _) _2 b8 |! X
老式铣床精度要求没那么高。。。 达到秒数就够了。。。
: i& D+ M; ?! i
 楼主| 发表于 2013-9-15 09:03:58 | 显示全部楼层
逍遥处士 发表于 2013-9-14 23:11 . a* J6 L& H2 [  G
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
' n! G- |5 }( A1 m3 r假如齿数 ...
! s6 y0 S/ w& Z% q2 Q3 U
按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

×

点评

搞错了。应该把 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 | 显示全部楼层
把那两行改成这样试一试:% k& t" W* q! }2 |) n$ |, j( V, ?
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
" t% q5 e, v& E5 r  uif ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
 楼主| 发表于 2013-9-15 11:42:32 | 显示全部楼层
逍遥处士 发表于 2013-9-15 10:41 * S5 V# Q% U! v2 i% a
把那两行改成这样试一试:
: b9 s& _2 T9 bif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
  b" K. }9 w8 j7 ?) [* _if ( (b+f)>=60 )  a=(b+f)/60;  ...

9 ]1 p9 v7 b% ?' t改后是这个结果,也不行。

本帖子中包含更多资源

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

×
发表于 2013-9-15 11:57:54 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑 $ x# C1 M4 Q% g% i7 ?/ t
昨日明月 发表于 2013-9-15 11:42 % A; Z- k* F9 |  N- z
改后是这个结果,也不行。

  Z2 A" W1 m6 h1 W8 L8 t8 i( M% H% P0 b8 {0 r
漏掉了一个 号,哈哈!
% ]7 Y! w/ ~$ l吾宝刀未老也!+ [) k2 G8 X, X/ L3 V

9 H  [3 W$ `# A

本帖子中包含更多资源

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

×

点评

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

本版积分规则

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

GMT+8, 2025-8-14 21:38 , Processed in 0.071122 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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