机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月
打印 上一主题 下一主题

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

[复制链接]
11#
发表于 2013-9-14 23:11:39 | 只看该作者
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑
) Y% C* D6 v; \# n, g- X' C$ O! |. `% ~  i
$ M, Z3 g6 \- m& S
( N+ W" i2 W) d
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
) l% m" A& p5 [# n假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?
5 o, o) b" D; e5 T5 E1 b0 J6 ^
$ ]0 v" K+ r0 G* f/ v; g假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:. R2 Q: U5 I* P8 B( H4 z

! H' \+ B' l) o/ f6 O# @int a=0, b=0, c=0; ) w& a! K- M& O! n: A. y
while ( a<360 )
" N0 \# y8 W( n# `% i( s9 c  z/ [$ z{
4 h6 r+ u; h8 @/ Q; @& X  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60;
5 k' e+ {. Q& C8 P$ u; X  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60; & d; G& Z, l2 f5 e% K
  a=a+j;
0 `2 K% U2 N: ?  printf("%d°%d′%d″\n",a,b,c);1 m/ ?" n, X) }! t" H+ F
}  h0 k  ^" `) B
: x4 h+ h# J2 a+ P
不妨试一试,看下结果。) p: w2 r3 H4 `: m

  c9 ?$ D4 A8 p. R8 c) j

本帖子中包含更多资源

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

x

点评

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

使用道具 举报

12#
发表于 2013-9-15 08:20:37 | 只看该作者
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。
0 a; B* b" l* ^3 n# w
* w9 T( f' Z0 e4 Y1 k0 e. _+ U% b& t0 d楼主程序中的) B3 O. a3 n( E, n1 f5 C
  @6 b, t9 K( `8 i- l
    int  m=22734;* A0 G9 x" @  l+ g+ l
( N' e" e, O- c, X8 s+ T
该值是做什么用的?该值如何来的?
回复 支持 反对

使用道具 举报

13#
 楼主| 发表于 2013-9-15 08:22:37 | 只看该作者
fmdd 发表于 2013-9-15 08:20
1 {+ ]" x, }! M隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...

8 n( |6 H/ ]1 Y$ V取的值,可以变化的。是6°18′54″转化为秒数: m! o  b- F! z# U
回复 支持 反对

使用道具 举报

14#
发表于 2013-9-15 08:31:22 | 只看该作者
本帖最后由 fmdd 于 2013-9-15 08:33 编辑 + J4 K8 c* Q  e4 @' q
昨日明月 发表于 2013-9-15 08:22
8 G. O0 H/ ?& I7 H3 n3 d* b0 ^取的值,可以变化的。是6°18′54″转化为秒数
+ `4 Z( Q( C  ~& b! J0 ~
这个取值本身就损失了精度/ w- i% s4 C- |1 c4 K, ^  S5 _/ u

. Q/ |0 V) @# j% f6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°
+ ~/ ^( k3 X* \& E" o- p) Z& n" U& }
这里的精度损失造成了最后累加数值偏差。7 `, t" e0 Z0 ?' V% y
回复 支持 反对

使用道具 举报

15#
 楼主| 发表于 2013-9-15 08:33:11 | 只看该作者
fmdd 发表于 2013-9-15 08:31
3 A. j5 I! A1 }; g7 T/ a这个取值本身就损失了精度( K# i: {0 W; ?$ a6 l) W  O

3 b1 s* s! F9 X3 j5 \" B. |$ L6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...

2 ]8 p+ o( U5 i) r+ u老式铣床精度要求没那么高。。。 达到秒数就够了。。。# s' @0 |, K7 z, p. Y( ^* p
回复 支持 反对

使用道具 举报

16#
 楼主| 发表于 2013-9-15 09:03:58 | 只看该作者
逍遥处士 发表于 2013-9-14 23:11
: b/ Z! Y1 T+ f8 y3 q4 i5 p: ]这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。' `4 y" \6 |- A9 N( V
假如齿数 ...
) Z; N$ {6 S3 ?: s1 v
按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

x

点评

搞错了。应该把 if 语句放前面。  发表于 2013-9-15 10:40
回复 支持 反对

使用道具 举报

17#
发表于 2013-9-15 10:39:52 | 只看该作者
这是一个很有意思的问题。我也试了以下,结果当i = 5的时候,c 确实等于29。为此,当i = 5的时候,检查 c 取整以后的余数 =1 ,也是一个整数。它就是 c 所差的数,由此,我就怀疑程序本身的内部函数在处理“余数”的问题?!为此,我把6°18′54″化成22734″的数值改成了22734.0001″,结果一切正常。这说明你所编的程序并没有错。请试试看。
回复 支持 反对

使用道具 举报

18#
发表于 2013-9-15 10:41:38 | 只看该作者
把那两行改成这样试一试:
1 r" u5 _. e7 W. xif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; , V1 x5 `% q3 R/ |+ K! J8 o
if ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
回复 支持 反对

使用道具 举报

19#
 楼主| 发表于 2013-9-15 11:42:32 | 只看该作者
逍遥处士 发表于 2013-9-15 10:41 - _0 A0 {  p$ U1 x* B
把那两行改成这样试一试:
. a' W( C8 _6 W3 Sif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
! F# H* p5 r& D, Mif ( (b+f)>=60 )  a=(b+f)/60;  ...
; B: D8 a* @* c
改后是这个结果,也不行。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

20#
发表于 2013-9-15 11:57:54 | 只看该作者
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑 ' s9 n# K- r  o9 u5 V# p! c8 O
昨日明月 发表于 2013-9-15 11:42 * P' Q8 ]7 A# {
改后是这个结果,也不行。

8 e. j2 U# ~! q& N0 ^/ P) d3 ]
漏掉了一个 号,哈哈!& h( p; H, u1 k* Y$ ?* y
吾宝刀未老也!
+ _0 W6 e9 c5 ^( v( R) r* ^- H; d: Y* X7 v2 L' c7 p# D

本帖子中包含更多资源

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

x

点评

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

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|机械必威体育网址 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-1-8 12:02 , Processed in 0.056229 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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