机械必威体育网址

 找回密码
 注册会员

QQ登录

只需一步,快速开始

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

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

[复制链接]
11#
发表于 2013-9-14 23:11:39 | 只看该作者
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑 1 n7 ?! V- I% g7 w
" a. o* X% x4 |5 c; k( u) Y
* ?6 O! I  K0 Z" W
8 D9 p$ J' R3 w2 ]: Z* X4 c! M
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。" q# g# L. F+ |5 p% Y$ e
假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?5 [- D% D$ S. F' R' r: {
  X4 r! Z1 l# a3 [' v- y
假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:
; E1 \% j0 s( i- k- x+ X% H7 Q1 ?! x5 ^
int a=0, b=0, c=0; % ~4 u$ L# e9 b# \3 F7 S0 R. W
while ( a<360 )
6 L; w$ W+ n: ~$ ~{
6 w9 L' x7 b5 \3 Q/ y% m1 \) b  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60; # U' T9 v6 n& x9 `
  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60; ' l& }: H3 |8 D: S" x8 C7 O
  a=a+j;
( G9 I# r% f1 R( U6 H  printf("%d°%d′%d″\n",a,b,c);
/ P5 T: W5 Z& n$ ?}
4 c" i! z+ J$ [6 v/ K3 J! l0 }
, ]3 t6 s7 I$ ~2 C0 V不妨试一试,看下结果。* \0 Y1 ?' u4 T! N* _$ J4 c+ F
9 e2 S8 D3 ]3 C/ H+ ~/ S4 u

本帖子中包含更多资源

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

x

点评

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

使用道具 举报

12#
发表于 2013-9-15 08:20:37 | 只看该作者
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。
, P9 q, H; b6 Q* j) _/ Q3 b  l  ~, z" G2 Z/ F9 z
楼主程序中的
% P7 x  {) H* R7 b) @
- Y0 V; c  W1 u& J; H    int  m=22734;* k) `- l0 T" W

* j, _! a) U  ?- G4 M+ H该值是做什么用的?该值如何来的?
回复 支持 反对

使用道具 举报

13#
 楼主| 发表于 2013-9-15 08:22:37 | 只看该作者
fmdd 发表于 2013-9-15 08:20 0 y4 C  U+ I4 e) r- {) i) M# C7 S
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...

( O3 ?. G4 w) k/ ]/ d- M1 A( m" |取的值,可以变化的。是6°18′54″转化为秒数6 ?2 Y: L- |$ v; v) ~$ A8 S
回复 支持 反对

使用道具 举报

14#
发表于 2013-9-15 08:31:22 | 只看该作者
本帖最后由 fmdd 于 2013-9-15 08:33 编辑
0 R) |4 Q% z7 W
昨日明月 发表于 2013-9-15 08:22
+ P( o5 L. f  ?. c2 [取的值,可以变化的。是6°18′54″转化为秒数

5 c8 _& v4 y# W这个取值本身就损失了精度
) d! ]) W& S) B, i1 U" T2 ?0 ^9 y  e- }( r
6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°" a& t8 Q, a$ _2 z

: m0 @$ j  [" o1 @' v' h这里的精度损失造成了最后累加数值偏差。
4 o  i4 e; R/ K7 Z. e# j
回复 支持 反对

使用道具 举报

15#
 楼主| 发表于 2013-9-15 08:33:11 | 只看该作者
fmdd 发表于 2013-9-15 08:31
( u5 X. z3 x3 c1 v这个取值本身就损失了精度* j4 v+ M$ a0 n, h) I

  R" {# V  f/ p2 T. f$ y6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...
( f. Z' D3 W+ s6 }0 t
老式铣床精度要求没那么高。。。 达到秒数就够了。。。
; l4 t% s# z9 E" D
回复 支持 反对

使用道具 举报

16#
 楼主| 发表于 2013-9-15 09:03:58 | 只看该作者
逍遥处士 发表于 2013-9-14 23:11
3 n' H* ^8 B9 {1 C9 C这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。: f$ w8 c8 d  y! |1 B
假如齿数 ...

( c5 i9 k1 A5 R0 K0 r4 p按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

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 | 只看该作者
把那两行改成这样试一试:
$ @9 x1 l$ n, {5 g5 X. J+ E/ \- Kif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; 4 ~; \- z  ~2 a8 E- x9 q7 {+ Q% 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
" V) e- ?$ r5 [# G% B- ^6 B5 ~把那两行改成这样试一试:
1 o7 b6 x) R0 z) e. fif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60; 7 t) |3 u6 t2 P
if ( (b+f)>=60 )  a=(b+f)/60;  ...
; V  N2 n, p* k) A) u7 m
改后是这个结果,也不行。

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

20#
发表于 2013-9-15 11:57:54 | 只看该作者
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑 " z; j) G3 y9 o
昨日明月 发表于 2013-9-15 11:42 ! s1 z2 a& y  P) G
改后是这个结果,也不行。

( d* \: A2 w# I  L( D8 h) E, W/ k' g2 J. e% Z, j( h2 {
漏掉了一个 号,哈哈!1 y6 G( \$ f+ a% e8 ~0 J+ J8 X
吾宝刀未老也!
% {- b+ W& G  \0 k1 K2 `& b9 z1 s* a) U  R! H

本帖子中包含更多资源

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

x

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 10:28 , Processed in 0.061377 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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