逍遥处士
发表于 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
改后是这个结果,也不行。
漏掉了一个 + 号,哈哈!
吾宝刀未老也!