找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
楼主: 昨日明月

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

[复制链接]
发表于 2013-9-14 23:11:39 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑
% p1 n, H/ y' n8 B3 Z$ _) W: L* d$ l
, t# r- `1 w* ?% l& W
# Q- T$ J* g5 b, {
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。# X1 \% H' @9 g: y/ V
假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?+ v1 g  u9 `; c/ S- M& }" q

$ _* P% \5 K- O0 P3 f假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:
3 c& i8 N2 W4 k# ]/ o. B# H$ N
5 m& J- O& r9 t1 S0 y4 @3 |9 jint a=0, b=0, c=0; 0 i/ a4 v1 Q! o7 @" ^
while ( a<360 )+ `- n5 L2 A( q3 |0 F
{
& }8 B) F: Z8 ~9 Z  v+ z: q, \2 R  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60; - [9 `( Q- A7 U1 {; w
  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60; 0 d; e/ w  Y/ D- P
  a=a+j;
  l) ~! k5 `* w) D5 ~. i  printf("%d°%d′%d″\n",a,b,c);* ~9 ~6 ^/ Y6 z( X& _7 d
}
% Z7 I  d- ]4 [# Z  g; j. i+ H( S' C# H- G, q! x9 ?
不妨试一试,看下结果。
4 a; s$ M5 i) H+ `
2 `3 Q7 q+ ]: ~4 ?" ?2 c

本帖子中包含更多资源

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

×

点评

有点问题,改正在17楼。  发表于 2013-9-15 10:40
发表于 2013-9-15 08:20:37 | 显示全部楼层
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。  r( I8 f: Z/ I) N: P

1 g6 F. z9 a" m! c8 s8 P. ]楼主程序中的% v! c' O' ?& x; y, |7 C+ ?
4 ]8 O& E, @; K. v
    int  m=22734;/ E; B' |2 V% J( o9 B2 B0 e
7 Z/ v2 H/ U- R, ^2 L  d
该值是做什么用的?该值如何来的?
 楼主| 发表于 2013-9-15 08:22:37 | 显示全部楼层
fmdd 发表于 2013-9-15 08:20
  g- h( D& Q2 P隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...

: u: Y8 B. F2 h  ^取的值,可以变化的。是6°18′54″转化为秒数
6 j; P# P) ^" H  A3 o" `
发表于 2013-9-15 08:31:22 | 显示全部楼层
本帖最后由 fmdd 于 2013-9-15 08:33 编辑 0 G  I8 R" f9 a2 _
昨日明月 发表于 2013-9-15 08:22 - e- y! U9 E" t4 ]
取的值,可以变化的。是6°18′54″转化为秒数
( l, M5 V( x, v4 a
这个取值本身就损失了精度
# p! q! s) J' ^, O9 O) W9 [
* W  Q5 i! a1 R3 n- H" i; X4 g  z6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°
$ e- W! Q  y8 y8 e' r( U7 q9 F9 R$ }0 \9 @3 L( L8 ?
这里的精度损失造成了最后累加数值偏差。8 q! I7 ^0 _  R8 A  g
 楼主| 发表于 2013-9-15 08:33:11 | 显示全部楼层
fmdd 发表于 2013-9-15 08:31
+ f3 t% \2 H# l. F, _2 L这个取值本身就损失了精度: k% M( [+ K1 O  D

' D" B  q3 w: a" N7 e6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...
) f) |% N9 {/ \9 A0 u8 ^& G4 o6 m! Y0 M
老式铣床精度要求没那么高。。。 达到秒数就够了。。。
3 X; S5 S+ [/ k; r2 _2 _
 楼主| 发表于 2013-9-15 09:03:58 | 显示全部楼层
逍遥处士 发表于 2013-9-14 23:11 ! |  f2 t2 b) ?
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。/ y+ v" p3 D. p6 M8 _$ q# o8 @. [
假如齿数 ...

" r6 y2 ?* F5 C按照逍遥前辈的代码运行还是有问题呢?

本帖子中包含更多资源

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

×

点评

搞错了。应该把 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 | 显示全部楼层
把那两行改成这样试一试:
' ~% O2 M6 [9 ]: `# wif ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;   M- C9 \3 u: o1 ?- [
if ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
 楼主| 发表于 2013-9-15 11:42:32 | 显示全部楼层
逍遥处士 发表于 2013-9-15 10:41 * `2 k6 P6 ]! K6 ?! v
把那两行改成这样试一试:3 E0 E% m7 W+ I) {+ ?
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
" D; q5 D$ F) P3 u* y" A( A- z5 Wif ( (b+f)>=60 )  a=(b+f)/60;  ...

) a; N- b  e6 r, N改后是这个结果,也不行。

本帖子中包含更多资源

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

×
发表于 2013-9-15 11:57:54 | 显示全部楼层
本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑
3 ?3 B5 N9 L. T- R6 p" X! ^
昨日明月 发表于 2013-9-15 11:42
# _% @" d5 \, D- a改后是这个结果,也不行。
. X/ l8 J/ d. [9 T
* C4 t/ R6 P. G9 D
漏掉了一个 号,哈哈!
( g$ j* A0 ?4 I9 X% Z+ h/ I/ v吾宝刀未老也!- E0 k; A6 ^+ j7 N# t  y

5 g- I9 C: \; K. n( a5 l. m7 {5 Y* B9 S

本帖子中包含更多资源

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

×

点评

三分写,七分试。  发表于 2013-9-15 12:02
这次整对了。谢谢逍遥前辈。  发表于 2013-9-15 12:01
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

GMT+8, 2025-6-22 04:32 , Processed in 0.076801 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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