找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月

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

[复制链接]
发表于 2013-9-14 23:11:39 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑 ( E+ _  j6 n" ^1 @# w' x

0 L' I; j! ?, Y. x; v+ K. {3 B/ }% @2 f3 ]% C- G
5 M, a2 s9 ~+ W6 I: w8 w8 R# c3 N  X
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。. s5 B  f0 j, n* f* o
假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?
3 `6 N4 D' b' @  B( `( _: W& t( w
$ @# w0 G1 ?! S# F* U- M6 `假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:
) V  g+ [7 d+ S6 S1 e" V+ a# r4 A/ C# T( |) t# Y
int a=0, b=0, c=0;
  W+ F0 M2 ~# j' twhile ( a<360 )1 N& a- `5 F% Z& {; T: x
{' d( ?2 a% j7 a8 L% U2 _
  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60; $ p7 {" P& C. P8 ?. B( N
  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60; $ A7 E& I% W. M6 ^
  a=a+j;" z6 ^- S6 y) t* \+ r# C. |6 T3 y4 A
  printf("%d°%d′%d″\n",a,b,c);! p$ Y7 [# |( {3 X1 h; U
}
: B$ Y1 A# B. E' Y6 C$ N: U6 l+ _2 J: I, j9 Z2 @
不妨试一试,看下结果。5 S: F6 g7 E  Y. Q7 a
3 N  N* c. a% R  J

本帖子中包含更多资源

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

×

点评

有点问题,改正在17楼。  发表于 2013-9-15 10:40
发表于 2013-9-15 08:20:37 | 显示全部楼层
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。
! w# N  U( P/ s! g0 J- c# a$ q# p3 _" Z2 u) {- t
楼主程序中的
0 |, U7 Y1 Z1 i) S( Q. e
: `1 ]. e2 K3 L( F& \5 `! ^- I    int  m=22734;
5 L8 A( }* y5 H2 T$ {4 P6 o
& K8 q$ C3 ?( z% J该值是做什么用的?该值如何来的?
 楼主| 发表于 2013-9-15 08:22:37 | 显示全部楼层
fmdd 发表于 2013-9-15 08:20
; p1 e4 x1 v( q/ e隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...
- g0 i) R* K5 I' m4 a; u" V
取的值,可以变化的。是6°18′54″转化为秒数
  \4 C" s. h' E, E$ F, y3 Q% v7 F
发表于 2013-9-15 08:31:22 | 显示全部楼层
本帖最后由 fmdd 于 2013-9-15 08:33 编辑 ! N  v# |/ g3 J! s$ B7 `& D
昨日明月 发表于 2013-9-15 08:22
( i9 {: p, H: }# g7 |取的值,可以变化的。是6°18′54″转化为秒数
$ I! d, Z6 J! D* _5 q8 l- h$ `
这个取值本身就损失了精度. n/ g2 B/ L1 ?1 {+ n/ A/ U1 O
: T& ^4 T# H8 ]. `: {
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°
. f" ]! v4 D8 G% B9 y0 ]$ o- P7 l4 @2 ?: M+ a5 b. p( ~& m3 H0 K
这里的精度损失造成了最后累加数值偏差。
' C% E# e1 D( P
 楼主| 发表于 2013-9-15 08:33:11 | 显示全部楼层
fmdd 发表于 2013-9-15 08:31
2 o9 C8 C2 y% ^这个取值本身就损失了精度
8 K" J# J" N# m5 A
2 r, I8 Z8 }) I1 O6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...

  L6 S. y) R& [7 J' }老式铣床精度要求没那么高。。。 达到秒数就够了。。。
% M/ F+ J2 t& n. d
 楼主| 发表于 2013-9-15 09:03:58 | 显示全部楼层
逍遥处士 发表于 2013-9-14 23:11 4 s1 m- U& {' ], g8 D8 A3 K
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
+ e' M8 _' R$ x. }假如齿数 ...

( \: T7 }; M! q$ h4 l; r按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

×

点评

搞错了。应该把 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 | 显示全部楼层
把那两行改成这样试一试:/ O0 e  ]( s1 g$ j& I) [- |" t9 t5 `
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
" B& v" @4 R. w: z4 z/ Kif ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
 楼主| 发表于 2013-9-15 11:42:32 | 显示全部楼层
逍遥处士 发表于 2013-9-15 10:41 ! z( e  F9 Z) ~4 R9 ]% @* ^
把那两行改成这样试一试:
# B5 ^; Y. K: J+ Nif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; # [" y+ Q! C9 B; m! r
if ( (b+f)>=60 )  a=(b+f)/60;  ...

0 n8 D! C& M& j, z4 p改后是这个结果,也不行。

本帖子中包含更多资源

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

×
发表于 2013-9-15 11:57:54 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑 0 a/ t" c# Y' v
昨日明月 发表于 2013-9-15 11:42
2 P4 i5 y5 g: l# Q- Y! t改后是这个结果,也不行。
4 @; s7 S$ X8 F
1 U: T4 l  F( s3 l1 q
漏掉了一个 号,哈哈!( E' Y6 _5 s& Q' g
吾宝刀未老也!
, k8 e2 U  @5 S: W3 Z7 Q' O5 ?7 f- [: `
0 l' h5 D" i$ O3 r" w

本帖子中包含更多资源

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

×

点评

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

本版积分规则

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

GMT+8, 2025-9-19 08:49 , Processed in 0.076592 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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