| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1180 人关注过本帖
标题:牛顿迭代法-续
只看楼主 加入收藏
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
牛顿迭代法-续
[cpp]
程序代码:
float Q_rsqrt( float number ) {   
    long i; float x2, y; const float threehalfs = 1.5F;  
    x2 = number * 0.5F;   
    y = number;   
    i = * ( long * ) &y; // evil floating point bit level hacking   
    i = 0x5f3759df - ( i >> 1 ); // what the fuck?   
    y = * ( float * ) &i;   
    y = y * ( threehalfs - ( x2 * y * y ) ); // 1st iteration   
    // y = y * ( threehalfs - ( x2 * y * y ) ); // 2nd iteration, this can be removed  
    #ifndef Q3_VM #  
    ifdef __linux__ assert( !isnan(y) ); // bk010122 - FPE?  
    #endif  
    #endif return y;   
}  


一发不可收拾,请问有人可以说说里面的那句迷之代码的原理?
i = 0x5f3759df - ( i >> 1 );

引用自:
http://blog.


[此贴子已经被作者于2017-1-21 14:30编辑过]

搜索更多相关主题的帖子: number 
2017-01-21 14:29
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏
得分:10 
在代码中用一个没有声明定义的常数,可能是一个“经验数”或“试验数”。
据说用 0x5f375a86 比 0x5f3759df 还要好一点点,谁有兴趣去验证一下。
2017-01-21 16:40
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏
得分:10 
找到一段解释,不知对否?
    程序首先猜测了一个接近1/sqrt(number)的值,然后两次使用牛顿迭代法进行迭代。根号a的倒数实际上就是方程1/x^2 – a = 0的一个正实根,它的导数是-2/x^3。运用牛顿迭代公式x' = x – f(x)/f'(x),式子化简为x' = x * (1.5 – 0.5a * x^2)。迭代几次后,x的值将趋于1/sqrt(a)。
    但这段代码那个神秘的0x5f3759df,因为0x5f3759df-(i>>1)出人意料地接近根号y的倒数。
2017-01-21 16:49
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
回复 3楼 吹水佬
那推算,可能它们多次运行测试发现y的值都不变,就没必要按照公式去推算出y了,直接打印出y的值记录下来当作常量来用,不过需要验证才能证实猜想,今天找时间验证。
2017-01-22 15:40
快速回复:牛顿迭代法-续
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018586 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved