技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 1947|回复: 1
收起左侧

指针魔“数”

[复制链接]

85

主题

260

帖子

3765

积分

用户组: 管理员

No. 418

UID
418
精华
13
威望
52 点
宅币
1969 个
贡献
1367 次
宅之契约
0 份
在线时间
252 小时
注册时间
2014-8-9
发表于 2016-1-23 12:09:38 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
还记得老C在 http://www.0xaa55.com/thread-1702-1-1.html 帖子里边最后那堆代码吗?

float RandProducer(float x)
{
    float a;
    *(int*)&a = 0x407FFFFF; //What'd Fucking number is this? I wont tell you.
    return a * x - a * x * x;
}

现在我将要“解释” *(int*)&a = 0x407FFFFF; 这句话到底在干什么。
那么在“解释”之前,我需要扯一个淡——不!扯一个小故事。
一个关于老C自己的小故事。诶!好吧,观众走了一半了.....

http://www.0xaa55.com/thread-1544-1-1.html这个的时候,
正是我刚从帝都回来,第一次见完 @元始天尊 回来。不!并没有基情。
反而一大堆问题。这个手动开方我咋也理解不了。老C高中数学百分制卷子考过16分
也就是 0x10分或者020分。不信打电话给我高一数学老师 (1383838388)
一脸糊涂问谷歌。那是当然的。然后看到了一个惊人的算法:

float InvSqrt(float x)
{
        float xhalf = 0.5f*x;

        int i = *(int*)&x; // get bits for floating value
        
i = 0x5f3759df - (i>>1); // gives initial guess y0

        x = *(float*)&i; // convert bits back to float

        x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy
        return x;

}
这个是求1/sqrt(x)的函数。

double CustomSquare(double number)
{
        int i;
        if (number == 0.0)
                return 0.0;
        double result = number / 2.0; //迭代初始数
        for (i = 1; i <= ITERATIONTIMES; i++)
        {
                result = 0.5 * (result + number / result);
        }
        return result;
}

上面这个是老C辛辛苦苦千辛万苦习得的递归求sqrt(x)的代码。
咱们不用吐槽这个这个效率了。光看代码量,就知道能慢死人。

我来说说InvSqrt(float x)函数的故事。
它的函数原型出自于约翰卡马克(john carmack)所写的游戏:雷神之锤3。
据说呢真正的代码,在数字“0x5f3759df ”附近写有一行注释://what the fuck;
仔细观察该函数,根本没有循环!更无所谓递归。
使用了一个“不知所以然的”神秘“整数”,“0x5f3759df ”
而且直接求值,直接求值啊!
据说2呢,3D引擎底层要大量使用平方根倒数运算——这个A5比我清楚多了。问她问她:@0xAA55
我傻傻不知道的。
然后CHRIS LOMONT 这人, 是一位数学家/计算机科学家。对该数字进行了深入分析。
总结成文:论文如下:
InvSqrt.pdf (147.71 KB, 下载次数: 2)

本帖被以下淘专辑推荐:

In the beginning I was not the best.
And the world was also not the best.
But I still know that I am who I am.
Because I think that it is good.
I have been working hard.
I have been keeping growth with the world.
And it was so.
回复

使用道具 举报

1060

主题

2443

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
221
威望
348 点
宅币
19518 个
贡献
40309 次
宅之契约
0 份
在线时间
1846 小时
注册时间
2014-1-26
发表于 2016-1-23 14:40:03 | 显示全部楼层
唔,DirectX就有要求用户这么用的,典型的,IDirect3DDevice9::SetRenderState中的好几个State都是必须*(DWORD*)&浮点数的。它的参数是DWORD类型,但是它很多State都是要输入浮点数的。

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图  

GMT+8, 2020-7-16 11:06 , Processed in 0.107287 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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