如何解决C:计算2个浮点之间的距离,取模12
|| 我需要一个函数dist(a,b)// 0≤a,b <12,该函数使用模12返回最短(绝对值+ ve)距离ala时钟算术。 例如dist( 1,2 )
= dist( 2,1 )
= dist( 11,0 )
= dist( 0,11 )
= dist( 0.5,11.5 )
= 1
编辑:虽然可以轻松地通过一些黑客手段来做到这一点,但我觉得必须有一些直观的解决方案,可能是使用fmod和modulo 6
解决方法
首先,最优解决方案是不平凡的,这需要一些思考。
float distMod12(float a,float b)
{
float diff = fabs( b - a );
return ( diff < 6 ) ? diff : 12 - diff;
}
编辑:或者,
return MIN( diff,12 - diff ); // needs a MIN function
完整的代码在这里列出:http://ideone.com/XxRIw
, 如果我没看错的话,a和b不是负数,并且小于12。
#include <math.h>
#include <stdio.h>
double min( double a,double b ) {
return a < b ? a : b;
}
double dist( double a,double b ) {
return min(
fmod( 12+b-a,12 ),fmod( 12+a-b,12 )
);
}
int main() {
printf(\"%f\\n\",dist(1,2));
printf(\"%f\\n\",dist(2,1));
printf(\"%f\\n\",dist(11,0));
printf(\"%f\\n\",dist(0,11));
printf(\"%f\\n\",dist(0.5,11.5));
return 0;
}
简化为
double dist( double a,double b ) {
double diff = fmod( 12+a-b,12 );
return diff <= 6 ? diff : 12-diff;
}
, 就像是
float dist( float a,float b ){
float amod,bmod;
amod = fmod( a,12 );
bmod = fmod( b,12 );
if( amod < bmod ) return dist( bmod,amod );
return min( amod-bmod,bmod-amod+12 );
}
使用数学库。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。