机械必威体育网址

用户名  找回密码
 注册会员

QQ登录

只需一步,快速开始

帖子
楼主: 昨日明月
打印 上一主题 下一主题

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

[复制链接]
11#
发表于 2013-9-14 23:11:39 | 只看该作者
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑
% F5 x8 y3 `9 p4 ], V# {
) ?3 s0 Z! }' K$ I! |! N/ ?" c# l& f. Y5 E. R3 O8 Z

/ }1 P: u1 f6 P* }* X# I, a这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
  l8 c9 m) V% f8 T假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?: t# N) a6 G0 ^% ]
; ?, ?  _$ t  r. G# O
假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:3 X; \) y: i( D8 n
1 `' M/ v5 X/ u6 s$ G1 p
int a=0, b=0, c=0;
) |& i. [! H, ~/ \: w& ^# q, r+ qwhile ( a<360 )
% [- X; A9 b, Z* K$ {{
. B, b) N( S5 w  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60; / H4 `* L! p4 O+ o& r
  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60;
: e7 e( o! y8 d" n  [  a=a+j;$ m4 o" @7 l! a# h8 q9 ]( k
  printf("%d°%d′%d″\n",a,b,c);
% L4 B  V& @2 P8 ?* |; {/ a}; g, [& m! [+ _+ w

9 a2 _" a" O. p* e" q6 k# E! S不妨试一试,看下结果。5 m* L3 i+ x# c( }. [! i# I3 ^

  V( O% [% o' ~* N. v

本帖子中包含更多资源

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

x

点评

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

举报

12#
发表于 2013-9-15 08:20:37 | 只看该作者
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。
/ [3 H. P, e1 [$ \: s0 _- A
# o4 G1 }) j4 T楼主程序中的; o/ [) u! Z' Z8 a7 Q

3 [) V3 m" r( [& @    int  m=22734;
0 T) I( Y$ F. c" D: W1 C2 j7 f% B: y/ ~8 A6 h
该值是做什么用的?该值如何来的?
回复 支持 反对

举报

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

  p$ k5 p$ v( b" {& E取的值,可以变化的。是6°18′54″转化为秒数% d% U1 g# |- t% G
回复 支持 反对

举报

14#
发表于 2013-9-15 08:31:22 | 只看该作者
本帖最后由 fmdd 于 2013-9-15 08:33 编辑 % |3 R3 _8 c! G9 s& E1 T& v; ]
昨日明月 发表于 2013-9-15 08:22 4 T1 f* M' G8 s$ j- a: o
取的值,可以变化的。是6°18′54″转化为秒数

& J  @3 Y* ~( b$ e. @6 J' G这个取值本身就损失了精度
! a; t5 j* ^. L! c5 x  w
1 B, A* {; J9 K9 v7 Z" s; O7 [  u1 c6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°
9 l5 f) h4 _' ^
" |  ^+ e& f# c这里的精度损失造成了最后累加数值偏差。1 G( s( @, f7 W% U9 D+ e( p
回复 支持 反对

举报

15#
 楼主| 发表于 2013-9-15 08:33:11 | 只看该作者
fmdd 发表于 2013-9-15 08:31 2 D$ R3 h! D9 Q: ^2 R! H
这个取值本身就损失了精度2 k- I) v' v5 O7 O/ B

( q9 p: J. m- M7 R7 w6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...
( X+ [, U( J9 `7 b
老式铣床精度要求没那么高。。。 达到秒数就够了。。。
# V" [. ^0 i; }6 J. P
回复 支持 反对

举报

16#
 楼主| 发表于 2013-9-15 09:03:58 | 只看该作者
逍遥处士 发表于 2013-9-14 23:11 7 D( r/ P; ]' z5 T5 ^& G6 ]
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。& s  C$ ^, G) {" d/ [2 o! @
假如齿数 ...

8 t) g, P: ^( P5 h* K- W按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

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 | 只看该作者
把那两行改成这样试一试:
4 V% o) a+ l9 i' y% pif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; $ l, I; E$ {& ]1 w: S
if ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
回复 支持 反对

举报

19#
 楼主| 发表于 2013-9-15 11:42:32 | 只看该作者
逍遥处士 发表于 2013-9-15 10:41
' F$ J# ?7 c" }) k6 i, V+ T把那两行改成这样试一试:/ i$ o% e( K' I  ~
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
. |+ e9 c, S2 |4 w5 ]8 qif ( (b+f)>=60 )  a=(b+f)/60;  ...
' x: ], t/ o  x' H* p& t2 J
改后是这个结果,也不行。

本帖子中包含更多资源

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

x
回复 支持 反对

举报

20#
发表于 2013-9-15 11:57:54 | 只看该作者
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑 " _# @1 _8 c' D
昨日明月 发表于 2013-9-15 11:42 : z- A% N9 V1 b
改后是这个结果,也不行。

) o1 n0 Q# `/ h; B" j: Y
1 o4 v6 I; E) s1 A( t# ^漏掉了一个 号,哈哈!
# d* r8 n& }! S: C% h$ V+ M4 R吾宝刀未老也!
' h+ K/ X7 _' a  R1 Y2 Z/ _$ S# Y9 l9 b

本帖子中包含更多资源

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

x

点评

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

举报

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

本版积分规则

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

GMT+8, 2025-4-3 07:29 , Processed in 0.070393 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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