浮点转整数的宏

union luai_Cast { double l_d; long l_l; };
#define lua_number2int(i,d)  { volatile union luai_Cast u; /
   u.l_d = (d) + 6755399441055744.0; (i) = u.l_l; }/
   printf("%d/n", i);

很神奇的宏,可以试一下

这个宏神奇的在正数和负数的双精度浮点数时都可以正确工作,以四舍五入方式转换为 32 位整数。

这个数字是 1.5*2^52 :) 小于 2^31 的数字在和这个magic number 相加的时候,按浮点加法的规则(以科学计数法记数),和一定按幂大的一个对齐。而 1.5 是2进制的 1.1 在浮点标准中,小数点前的 1 是不需要记录的。这样,double 的前四字节就被空出来。而需要转换的整数将因为加法恰当的被置入对应的位置。

这个技巧并不总是适用,比如初始化 D3D9 以后,就会失效。因为 D3d 默认会调整浮点运算的精度。在低精度模式下,这个技巧显然不能工作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值