機械社區(qū)

 找回密碼
 注冊會員

QQ登錄

只需一步,快速開始

搜索
樓主: 昨日明月
打印 上一主題 下一主題

求解一個C語言程序功能是每隔6°18′54″就增加6°18′54″并輸出結果的程序問題。

[復制鏈接]
11#
發(fā)表于 2013-9-14 23:11:39 | 只看該作者
本帖最后由 逍遙處士 于 2013-9-14 23:35 編輯 0 V/ f) `* v/ S0 s' X

: ^! C5 E: {& ^4 c0 p! G) p
: c: {( |' G1 @! t" t/ r8 i5 ?. ^
- }" T# ]0 @, q, p這是用MathCAD做的計算,程序跟一樓一樣,可見第5個也是29,就這來看樓主的程序可能有缺陷。4 M. Z7 R' P: O' {" W; H
假如齒數為57,則360*3600/57不能整除,問題是否出在這兒?
* w6 t; \+ X* s0 a' o
. ~3 n- T; _# N假設所給齒數能整除的話,不妨只考慮將第一個角度依次翻倍,代碼如下:
2 i' v! E. z3 v0 c, Q% t7 I8 `( k" v+ z( k  Z2 ~
int a=0, b=0, c=0;
1 m; x9 {. ]6 c4 ^while ( a<360 )
$ _+ e% Z/ u/ ?( N$ A{
3 g; {3 U/ I* u8 Y  c=(c+s)%60; if ( (c+s)>=60 )  b=(c+s)/60; 3 x" K+ S6 c: c  e
  b=(b+f)%60; if ( (b+f)>=60 )  a=(b+f)/60; $ T1 U5 K: B* E$ a
  a=a+j;
! O& X0 i; K0 P  printf("%d°%d′%d″\n",a,b,c);
- D" B  R4 m3 j1 R8 U}
) Q) b8 v- D6 r8 z9 a
5 E: O+ q# S4 n8 W- M3 E不妨試一試,看下結果。
# l- S9 z& M, V; k9 o  E/ A4 f" @2 @" z$ H1 t8 m% T/ c

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊會員

x

點評

有點問題,改正在17樓。  發(fā)表于 2013-9-15 10:40
回復 支持 反對

使用道具 舉報

12#
發(fā)表于 2013-9-15 08:20:37 | 只看該作者
隱含的升位運算和強制降位運算都會遭遇精度損失,如果取值范圍夠用的話,參與運算的數據最好都統(tǒng)一為一種類型,比如全部為float型。: l+ V$ H) O! ]2 k

" s( E- |; n- f) s" o0 O樓主程序中的5 @9 E- `# G7 g4 y0 y
( A: v, L* \# t$ r/ {4 }  l
    int  m=22734;
  O! {; I" I7 \
" T& F9 R% l- U& o2 v& K" R該值是做什么用的?該值如何來的?
回復 支持 反對

使用道具 舉報

13#
 樓主| 發(fā)表于 2013-9-15 08:22:37 | 只看該作者
fmdd 發(fā)表于 2013-9-15 08:20
- [; I: V, X, k5 T3 Y( z隱含的升位運算和強制降位運算都會遭遇精度損失,如果取值范圍夠用的話,參與運算的數據最好都統(tǒng)一為一種類 ...
& x- v2 n' Y- k: l
取的值,可以變化的。是6°18′54″轉化為秒數) j5 V6 y" F, b# b+ W
回復 支持 反對

使用道具 舉報

14#
發(fā)表于 2013-9-15 08:31:22 | 只看該作者
本帖最后由 fmdd 于 2013-9-15 08:33 編輯
2 b7 d' Q( J1 ^, j
昨日明月 發(fā)表于 2013-9-15 08:22
: M  J, M, [+ j/ I& r( k取的值,可以變化的。是6°18′54″轉化為秒數

3 g" \! x+ k- K; T1 \( Z5 J9 g; ~這個取值本身就損失了精度* @( l$ I% @; z) i- T; a1 M

* h2 t& a7 `; W6°18′54″是指一個齒的轉角是么?這個值的精度不夠,計算出來是6.31578947……°9 C0 l: ]9 p! J/ E2 v- C0 ^3 o  I
! n1 o0 v5 q% C0 b' }& K3 x" z* v& \
這里的精度損失造成了最后累加數值偏差。
& y) \0 d, I$ c* C# _0 t2 K1 D
回復 支持 反對

使用道具 舉報

15#
 樓主| 發(fā)表于 2013-9-15 08:33:11 | 只看該作者
fmdd 發(fā)表于 2013-9-15 08:31
3 ^$ w, b; ^' ~8 ]3 I% u. d8 L這個取值本身就損失了精度
+ S5 s# E' [4 J( u0 @7 v9 S
4 N+ g& d- s: ~+ j: P1 a- {6°18′54″是指一個齒的轉角是么?這個值的精度不夠,計算出來是6.3157894 ...
0 C7 _) T+ ^# Y( A7 e# ]
老式銑床精度要求沒那么高。。。 達到秒數就夠了。。。% {7 c4 t3 c0 ~( D6 _
回復 支持 反對

使用道具 舉報

16#
 樓主| 發(fā)表于 2013-9-15 09:03:58 | 只看該作者
逍遙處士 發(fā)表于 2013-9-14 23:11
% {* T  i& Y; D# f6 w這是用MathCAD做的計算,程序跟一樓一樣,可見第5個也是29,就這來看樓主的程序可能有缺陷。
2 y( s' P& N! Z$ I7 f8 O假如齒數 ...
; }9 m# }& M- l' E
按照逍遙前輩的代碼運行還是有問題呢?

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊會員

x

點評

搞錯了。應該把 if 語句放前面。  發(fā)表于 2013-9-15 10:40
回復 支持 反對

使用道具 舉報

17#
發(fā)表于 2013-9-15 10:39:52 | 只看該作者
這是一個很有意思的問題。我也試了以下,結果當i = 5的時候,c 確實等于29。為此,當i = 5的時候,檢查 c 取整以后的余數 =1 ,也是一個整數。它就是 c 所差的數,由此,我就懷疑程序本身的內部函數在處理“余數”的問題?!為此,我把6°18′54″化成22734″的數值改成了22734.0001″,結果一切正常。這說明你所編的程序并沒有錯。請試試看。
回復 支持 反對

使用道具 舉報

18#
發(fā)表于 2013-9-15 10:41:38 | 只看該作者
把那兩行改成這樣試一試:* S* O$ H( S' n$ Z* \) Y
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
' |: z( o4 [' {! T) G! Rif ( (b+f)>=60 )  a=(b+f)/60;  b=(b+f)%60;
回復 支持 反對

使用道具 舉報

19#
 樓主| 發(fā)表于 2013-9-15 11:42:32 | 只看該作者
逍遙處士 發(fā)表于 2013-9-15 10:41
* ^5 C- N* F5 N) D* c" e把那兩行改成這樣試一試:: u4 r$ V2 q* J. n8 D) ?+ v! k
if ( (c+s)>=60 )  b=(c+s)/60; c=(c+s)%60;
# W0 y. W! T9 `; v$ m8 `if ( (b+f)>=60 )  a=(b+f)/60;  ...
2 y$ A( M2 o4 I& j
改后是這個結果,也不行。

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊會員

x
回復 支持 反對

使用道具 舉報

20#
發(fā)表于 2013-9-15 11:57:54 | 只看該作者
本帖最后由 逍遙處士 于 2013-9-15 12:00 編輯
. G3 c9 p) U" b; ~% G) j2 K
昨日明月 發(fā)表于 2013-9-15 11:42
/ p$ v- M8 ]5 O0 e; p) I改后是這個結果,也不行。
. @- f3 b1 }& F2 [# ?& _4 `+ O
) d2 C2 T6 [  E; }' j
漏掉了一個 號,哈哈!1 x4 k; ~. r" z
吾寶刀未老也!
' \0 i- H$ z. e) M0 V7 \- {% }5 Z

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?注冊會員

x

點評

三分寫,七分試。  發(fā)表于 2013-9-15 12:02
這次整對了。謝謝逍遙前輩。  發(fā)表于 2013-9-15 12:01
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊會員

本版積分規(guī)則

小黑屋|手機版|Archiver|機械社區(qū) ( 京ICP備10217105號-1,京ICP證050210號,浙公網安備33038202004372號 )

GMT+8, 2024-9-25 23:23 , Processed in 0.058559 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表