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 );

}
使用数学库。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...