机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月

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

[复制链接]
发表于 2013-9-14 23:11:39 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑
' s# ]. c" f: i8 B- E3 F/ v
( }' f! a+ K5 `: Q+ d0 g
8 U7 Y2 _& _# \) r3 N  P' \& s  a$ F* R* n, J% k2 ]
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
; _* O1 P. F: [. J* |1 _4 \& h假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?
4 \/ S8 R7 U" D0 i5 X' D1 I/ i8 h1 ~# a7 q
假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:" a& w9 x( S/ {: F( g) i  @% V

/ j2 L# Q' o- ^# ~* rint a=0, b=0, c=0;
7 B4 j. |9 |, Kwhile ( a<360 )/ B, J8 y" |: P0 p6 F0 ]
{
3 F4 V; ~' g. G4 b  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60;
& [4 a6 G! ]# \. C4 G! e( m6 F  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60;
6 l. O' x( y( d  a=a+j;: W9 j/ N& q3 n- M$ z
  printf("%d°%d′%d″\n",a,b,c);
! r, E( E/ \. C5 k7 r}
4 w( v% P, H- G4 ?% V0 r" P, L1 p6 F
不妨试一试,看下结果。* ^0 U* t( q- ~2 u. }" N$ D
2 O& X. n* c! `2 I+ ?

本帖子中包含更多资源

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

x

点评

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

使用道具 举报

发表于 2013-9-15 08:20:37 | 显示全部楼层
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。
! t2 H( v% Z: \/ E) n0 K: P
( g7 k& I! J" v, t2 O5 C) {楼主程序中的
7 p, q& F  k  \. D0 m; ]" d6 M! a% r6 P* W
    int  m=22734;
* @2 o" X3 |) y3 S
  H4 P# u8 T+ |5 M该值是做什么用的?该值如何来的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 08:22:37 | 显示全部楼层
fmdd 发表于 2013-9-15 08:20   ]; x2 m5 p; h5 z# e
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...
: _9 E  v( g; ]( y
取的值,可以变化的。是6°18′54″转化为秒数
# g' D9 b# U- m9 K
回复 支持 反对

使用道具 举报

发表于 2013-9-15 08:31:22 | 显示全部楼层
本帖最后由 fmdd 于 2013-9-15 08:33 编辑
+ `) g1 F' Q. d- Q: \4 o
昨日明月 发表于 2013-9-15 08:22
1 H# i1 r9 J0 V9 `! M$ j取的值,可以变化的。是6°18′54″转化为秒数
% R! @$ ?" F+ s. O
这个取值本身就损失了精度
$ T; M; {$ G6 b% `* b' @3 u; B$ W# l# l3 c" B
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°% a2 M  ^' p0 r% n; O( t/ r8 l
+ T$ S- J$ V3 Y/ W) Z5 U
这里的精度损失造成了最后累加数值偏差。
2 X+ A: ?# j8 e1 z$ N4 {8 W# [* R
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 08:33:11 | 显示全部楼层
fmdd 发表于 2013-9-15 08:31
2 f; x* v' n, o4 B这个取值本身就损失了精度5 h+ M7 |3 w5 D" B) C6 w4 w( l- M

; Q2 _  M2 {7 j! B) g6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...

5 D6 ^- Q  k9 i. M4 a! U老式铣床精度要求没那么高。。。 达到秒数就够了。。。' R* b: D2 n' i) E3 ^
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 09:03:58 | 显示全部楼层
逍遥处士 发表于 2013-9-14 23:11
) m* }1 V. k% w) S这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
, F/ }% n5 I' p: g假如齿数 ...
/ }& A# l, R- F9 Q: I6 b$ O( M
按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

x

点评

搞错了。应该把 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 | 显示全部楼层
把那两行改成这样试一试:
/ x0 K7 T- e" t, `7 ?( L  S# pif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; 3 m  M8 E8 N! u5 {8 ~
if ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 11:42:32 | 显示全部楼层
逍遥处士 发表于 2013-9-15 10:41 & n. j9 C, v4 @8 w$ \7 f; A
把那两行改成这样试一试:' e' A' m/ s6 t2 l
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; 5 [# T3 i4 t0 V/ H* n1 w4 P& C6 h  v
if ( (b+f)>=60 )  a=(b+f)/60;  ...

' G3 ^* H" W! k( r+ y" Q改后是这个结果,也不行。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2013-9-15 11:57:54 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑
% v) k0 M( T. j
昨日明月 发表于 2013-9-15 11:42 + A9 {0 D- d2 Y) a
改后是这个结果,也不行。

/ J2 F! q4 U  Z4 n% F' M: T
7 q1 \; o4 k9 O; J漏掉了一个 号,哈哈!
# C' {6 L4 g8 p' E! q吾宝刀未老也!' H( W/ T" z$ G8 |8 T0 d6 w
3 W: ~3 I; \- e

本帖子中包含更多资源

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

x

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-26 15:58 , Processed in 0.061966 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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