机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月

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

[复制链接]
发表于 2013-9-14 23:11:39 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑 . U, E7 P$ b' q
' Z- C6 Y5 D# S6 ]8 _0 ~

7 E, N/ q- k9 g/ G
+ {+ z# `% d( ^" a这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。9 B; X  j- l9 h6 J5 M' X& L
假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?
3 B5 B7 ?% i8 ]# k& X
& x  n5 h* M: c) }1 d7 h假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:
0 B4 ~/ s+ \* ^2 V+ G+ l# c/ W
int a=0, b=0, c=0;
: T& N- ^. i4 r% A6 I2 |+ O. Awhile ( a<360 )# b* Q2 J0 n4 V0 w( \; ?
{
. k, A, {4 |- _3 G, b5 \  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60;
' z2 ^& ~) a8 r. \# s. M7 [  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60; 3 }. S" t- Z8 w4 T. l% F% V
  a=a+j;
9 J. W4 E4 L8 P0 y  printf("%d°%d′%d″\n",a,b,c);
# i2 Q- [' m& Y) D7 j. g( f4 u}2 Z, e: T, \1 f% j+ l% W, }1 d
' ], D5 d" Z( X& ~. Z* |$ O" O% ]& d
不妨试一试,看下结果。& g- J/ [- @6 d4 ^$ E- W
' v4 z" L) A7 [0 T; w& ~

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2013-9-15 08:20:37 | 显示全部楼层
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。) Z# R! p* y: l% s( o% R
) a3 v- V. c' C: a$ Y# J
楼主程序中的+ E( i# h& n0 F9 O$ y/ H

* q8 L3 n# E7 o0 Y* s% {3 S4 c- h    int  m=22734;, ~* }4 C( R" j  R; [0 a1 _
; ?% M$ u9 s3 e5 @! z
该值是做什么用的?该值如何来的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 08:22:37 | 显示全部楼层
fmdd 发表于 2013-9-15 08:20 9 u2 }+ K8 T  i" _  h
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...

) \# o# P0 N& E, C& [取的值,可以变化的。是6°18′54″转化为秒数
) B! C% A& }4 c" l& |6 l
回复 支持 反对

使用道具 举报

发表于 2013-9-15 08:31:22 | 显示全部楼层
本帖最后由 fmdd 于 2013-9-15 08:33 编辑
) K+ z* A2 N  b* B0 y
昨日明月 发表于 2013-9-15 08:22 % ^+ N7 o: k; W3 a( q4 p
取的值,可以变化的。是6°18′54″转化为秒数

% N" g( X- a7 k- ~这个取值本身就损失了精度
( z( V& o$ b: ]3 S0 ^2 T1 x$ Y4 p' y& c- h) `0 H3 I
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°
. v9 y9 q% n# Q3 s6 T7 {
# o4 t* Y, d/ q8 }0 |9 A1 G/ d$ s这里的精度损失造成了最后累加数值偏差。6 R: f9 Y! P* H6 m$ c" D7 E, L
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 08:33:11 | 显示全部楼层
fmdd 发表于 2013-9-15 08:31 + [/ S$ D$ x$ G7 R1 Q7 [
这个取值本身就损失了精度3 s: f& B) L4 ]% n) F7 w9 q: B3 E

: E3 }; ^9 N% B, k/ G% d! w+ c6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...

4 Y: Q& H& L7 e& Y( R% P6 O老式铣床精度要求没那么高。。。 达到秒数就够了。。。
, w; M% @  }: B3 s( A  M0 O
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 09:03:58 | 显示全部楼层
逍遥处士 发表于 2013-9-14 23:11 # a9 Y, M; J# y
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
9 m2 m" Y& V3 _3 t/ B' R假如齿数 ...

3 K% [9 e- w2 s  ]按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

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 | 显示全部楼层
把那两行改成这样试一试:
9 Y/ e$ }* {% _$ }( Rif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; , ~3 x+ Q7 w- h( Z9 t$ l1 O
if ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-15 11:42:32 | 显示全部楼层
逍遥处士 发表于 2013-9-15 10:41 % _& L$ J9 S7 Z; o
把那两行改成这样试一试:8 P( _+ k% x$ M- @  l" D, F/ Y
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; 9 y( Q! E# Y, T+ `6 }
if ( (b+f)>=60 )  a=(b+f)/60;  ...

1 S; m0 [# V) S1 s3 v# W3 m9 C改后是这个结果,也不行。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2013-9-15 11:57:54 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑
" C9 f* B9 N; h/ ~' Z1 ]; c5 g% U* E
昨日明月 发表于 2013-9-15 11:42 / f/ X5 {% h# k, G8 z3 G9 A
改后是这个结果,也不行。

0 e. N2 o! v( |- [. h" s' l5 M; ]( t3 j3 C$ i, G' @
漏掉了一个 号,哈哈!4 F$ z8 `& k4 [& Q3 [
吾宝刀未老也!( }# V: P; d3 n( a  R2 D

  y2 A7 Z8 B2 j

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-1 12:24 , Processed in 0.096007 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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