找回密码
 欢迎注册
查看: 11932|回复: 2

[求助] 整型与浮点间的快速转换

[复制链接]
发表于 2016-11-21 10:10:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
现需要实现两个函数:
  1. #include <stdint.h>
  2. #include <math.h>

  3. double int64ToDouble( int64_t i64 )
  4. {
  5.         double dRet;

  6.         assert( -( 1LL << 48u ) < i64 && i64 < ( 1LL << 48u ));        // |i64|<2^48

  7.         // 快速将 64 位整型转化成浮点型:dRet = ( double )i64;
  8.         // ...
  9.         // ...

  10.         return dRet;
  11. }


  12. int32_t roundToInt( double * p )
  13. {
  14.         int32_t iRet;

  15.         assert( NULL != p );
  16.         assert( fabs( *p ) < 16777216.0 );        // |*p|<2^24

  17.         // 快速将浮点型 *p 四舍五入存进整型 iRet 中,然后从 *p 自身中扣除该整数部分
  18.         // 等效于:iRet = ( int32_t )*p;    *p -= ( double )iRet;
  19.         // ...
  20.         // ...

  21.         assert( fabs( *p ) <= 0.5 );

  22.         return iRet;
  23. }
复制代码


它与通用的转换函数略有不同,
主要是入参的取值范围略有收窄,不知可有更快速的算法?
另,要求仅用标准 C 写,以提高可移植性。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2016-11-21 17:21:19 | 显示全部楼层
我查阅了一些资料,第二个函数高效的完成了!并做到了“浮点取整并去整,一气呵成!

  1. // 浮点取整并去整,一气呵成!本快速算法由 Jason Guo 自创,2016-11-21

  2. const double MAGIC = 6755399441055744.0;   // 1.5*2^52

  3. intptr_t roundToInt( double * const p )
  4. {
  5.     const double f64 = *p + MAGIC;

  6.     assert( fabs( *p ) <= 2251799813685248.0 );    // |*p| <= 2^51
  7.     *p -= f64 - MAGIC;
  8.     assert( fabs( *p ) <= 0.5 );

  9.     return ( *( intptr_t * )&f64 );
  10. }
复制代码


备注:之所以说是“自创”,是因为当前遍寻网络,仅见“取整”功能而不见“取整且去整”之功能。

当入参 |*p| <= 2^51,运行后 *p 将正好保留去整后的残余小数值;
在 32 位系统下,需入参 |*p| ∈ [ -2147483648.5, 2147483647.5 - DBL_EPSILON ],以保证返回值不溢出。


下面,将尝试进行 int64 --> double 间的快速转换。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2016-11-22 10:13:55 | 显示全部楼层
啊哈!第一个函数也搞定了!
没有用强制转换的方法,而且效率更高!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-23 15:55 , Processed in 0.024533 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表