逍遥处士 发表于 2013-9-14 23:11:39

本帖最后由 逍遥处士 于 2013-9-14 23:35 编辑



这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
假如齿数为57,则360*3600/57不能整除,问题是否出在这儿?

假设所给齿数能整除的话,不妨只考虑将第一个角度依次翻倍,代码如下:

int a=0, b=0, c=0;
while ( a<360 )
{
c=(c+s)%60; if ( (c+s)>=60 )b=(c+s)/60;
b=(b+f)%60; if ( (b+f)>=60 )a=(b+f)/60;
a=a+j;
printf("%d°%d′%d″\n",a,b,c);
}

不妨试一试,看下结果。

fmdd 发表于 2013-9-15 08:20:37

隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类型,比如全部为float型。

楼主程序中的

    intm=22734;

该值是做什么用的?该值如何来的?

昨日明月 发表于 2013-9-15 08:22:37

fmdd 发表于 2013-9-15 08:20 static/image/common/back.gif
隐含的升位运算和强制降位运算都会遭遇精度损失,如果取值范围够用的话,参与运算的数据最好都统一为一种类 ...

取的值,可以变化的。是6°18′54″转化为秒数

fmdd 发表于 2013-9-15 08:31:22

本帖最后由 fmdd 于 2013-9-15 08:33 编辑

昨日明月 发表于 2013-9-15 08:22 static/image/common/back.gif
取的值,可以变化的。是6°18′54″转化为秒数
这个取值本身就损失了精度

6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.31578947……°

这里的精度损失造成了最后累加数值偏差。

昨日明月 发表于 2013-9-15 08:33:11

fmdd 发表于 2013-9-15 08:31 static/image/common/back.gif
这个取值本身就损失了精度

6°18′54″是指一个齿的转角是么?这个值的精度不够,计算出来是6.3157894 ...

老式铣床精度要求没那么高。。。 达到秒数就够了。。。

昨日明月 发表于 2013-9-15 09:03:58

逍遥处士 发表于 2013-9-14 23:11 static/image/common/back.gif
这是用MathCAD做的计算,程序跟一楼一样,可见第5个也是29,就这来看楼主的程序可能有缺陷。
假如齿数 ...

按照逍遥前辈的代码运行还是有问题呢?

zmq 发表于 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

把那两行改成这样试一试:
if ( (c+s)>=60 )b=(c+s)/60; c=(c+s)%60;
if ( (b+f)>=60 )a=(b+f)/60;b=(b+f)%60;

昨日明月 发表于 2013-9-15 11:42:32

逍遥处士 发表于 2013-9-15 10:41 static/image/common/back.gif
把那两行改成这样试一试:
if ( (c+s)>=60 )b=(c+s)/60; c=(c+s)%60;
if ( (b+f)>=60 )a=(b+f)/60;...

改后是这个结果,也不行。

逍遥处士 发表于 2013-9-15 11:57:54

本帖最后由 逍遥处士 于 2013-9-15 12:00 编辑

昨日明月 发表于 2013-9-15 11:42 static/image/common/back.gif
改后是这个结果,也不行。

漏掉了一个 + 号,哈哈!
吾宝刀未老也!

页: 1 [2] 3
查看完整版本: 求解一个C语言程序功能是每隔6°18′54″就增加6°18′54″并输出结果的程序问题。