找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月

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

[复制链接]
发表于 2013-9-14 23:11:39 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑
( A0 j$ K: S' ?. N% o! i, E3 O( M8 C5 z: S5 H* t. @. Z
6 h1 |2 D0 P; o/ v6 y  G
$ o; S! z7 `. J# Z) d8 |1 I
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
/ O& [: M% S- U$ `1 U% y6 S假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?
' m3 Z- Z7 E, o8 _+ q+ z/ c, G4 C/ Z$ Z% m6 q3 O/ g& a
假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:
1 D; C  F" \; q" k
2 C7 D' o, z: r5 ~8 O8 ]int a=0, b=0, c=0; ! d; T% X) @( Y5 B' F6 g: _
while ( a<360 )
: f3 `# R9 F# {! C. ~% Q{
. X, O% @- ?: g& R; K) B/ r  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60;
+ c$ a. g& M7 f6 k& x  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60; 2 c: Q# d( r# F5 b6 G( b5 I5 P
  a=a+j;" A/ M# |( b, f2 n
  printf("%d°%d′%d″\n",a,b,c);2 R: p  I, v$ h  D/ Y4 ~
}5 @* w4 B1 O; |1 d* v5 m

0 ]3 u+ w: X2 |! e  e不妨试一试,看下结果。
7 E& ?3 k9 g' v. J
1 p! v/ ~0 v2 h# e$ G8 ^0 O

本帖子中包含更多资源

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

×

点评

有点问题,改正在17楼。  发表于 2013-9-15 10:40
发表于 2013-9-15 08:20:37 | 显示全部楼层
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。! s! z: h5 G% x2 _. z( J: q; H' G& ~
+ Y( L3 Z* }' Y( \& ^
楼主程序中的
: ~. u' F# S4 W( I: ?( s3 b
0 G* j! q- F( I- M1 B' B" ?    int  m=22734;
+ l) U$ J# a5 u) t3 g7 I5 ~/ A# E9 f: N2 t5 ]) b
该值是做什么用的?该值如何来的?
 楼主| 发表于 2013-9-15 08:22:37 | 显示全部楼层
fmdd 发表于 2013-9-15 08:20
  Y+ H! p" G2 N) Y4 ]隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...
& ?+ r8 t' X3 b
取的值,可以变化的。是6°18′54″转化为秒数
, B: e  s$ Y+ D( ?  j+ E
发表于 2013-9-15 08:31:22 | 显示全部楼层
本帖最后由 fmdd 于 2013-9-15 08:33 编辑
( Z5 z" k# S4 b
昨日明月 发表于 2013-9-15 08:22
9 ~+ n. e) @$ R+ ?, I取的值,可以变化的。是6°18′54″转化为秒数

) Q, A( t, ~6 ]这个取值本身就损失了精度
% x. g$ l8 \, i7 d! ~' v  z5 N8 s% u* T6 ]5 c
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°
( V/ p- q2 J9 ~6 C4 U( I0 e& W# t0 Q
0 a' @& Y# A  h4 y2 b- i1 d这里的精度损失造成了最后累加数值偏差。7 |8 a3 ?$ N# S. u, b. T
 楼主| 发表于 2013-9-15 08:33:11 | 显示全部楼层
fmdd 发表于 2013-9-15 08:31
* {6 {' d( U1 P7 V1 J2 s$ O. C# F4 C这个取值本身就损失了精度
9 ^3 p1 G, l" a* d+ E) @' L' F5 c9 ?; p  ?5 B
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...
  I( y, n9 @$ W' {
老式铣床精度要求没那么高。。。 达到秒数就够了。。。- t4 ~+ p0 r% R7 ~  g' o) s9 H
 楼主| 发表于 2013-9-15 09:03:58 | 显示全部楼层
逍遥处士 发表于 2013-9-14 23:11 9 Z* ~+ ?' g! ]( B
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。$ m4 T4 p. s/ f. ~' O! g+ a
假如齿数 ...

7 e1 k! f  h0 c9 k9 W3 w3 ]- z按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

×

点评

搞错了。应该把 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 | 显示全部楼层
把那两行改成这样试一试:
% U1 l. c' b( ^5 Sif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
8 B% ?  f2 R" n8 m5 d0 D4 Oif ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
 楼主| 发表于 2013-9-15 11:42:32 | 显示全部楼层
逍遥处士 发表于 2013-9-15 10:41 7 P4 H0 J  y0 H- e: u
把那两行改成这样试一试:
5 r. v3 [$ z  y$ F* r& e, kif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
, t! O7 ~3 ~( V6 U& o/ Lif ( (b+f)>=60 )  a=(b+f)/60;  ...

  z% l% I% K+ P改后是这个结果,也不行。

本帖子中包含更多资源

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

×
发表于 2013-9-15 11:57:54 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑 # c& I2 D" z6 O2 G
昨日明月 发表于 2013-9-15 11:42 4 f( _( C0 M2 q3 @, z1 ^
改后是这个结果,也不行。

9 q' |2 E6 @" D9 V/ S& f5 J
4 P0 h1 i  O5 C5 [  v漏掉了一个 号,哈哈!
. j5 P# _5 B' Z# p吾宝刀未老也!" h- K' V- R  a- t% C
; C3 E& _1 j: Q. ?& v+ z

本帖子中包含更多资源

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

×

点评

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

本版积分规则

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

GMT+8, 2025-10-16 23:42 , Processed in 0.075033 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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