极客时间

左耳听风

2018-10-31  本文已影响0人  Jack_Cui

00开篇词

01程序员如何用技术变现上

02程序员如何用技术变现下

03从Equifax数据泄露看数据安全

04第四讲 从Equifax数据泄露看数据安全下

05何为技术影响力

技术领导力不仅仅是呈现出来的技术,而是一种可以获得绝对优势的技术能力。

说人话就是

要实现这些需要一些前提

06怎么才能拥有领导力

吃透基础知识

编程部分

系统部分

提高学习能力

坚持做正确的事

高标准要求自己

07 推荐一些有价值的东西

08 GO语言 Docker和新技术

09 渴望、热情和选择

10 如何成为一个大家愿意追随的Leader

Boss和Leader的不同

11 程序中的错误处理:返回码和异常捕捉

#include<iostream.h>                        //包含头文件

#include<stdlib.h>

double fuc(double x, double y)                        //定义函数

{

if(y==0)

{

throw y;                                    //[除数为0,抛出异常

}

return x/y;                                    //否则返回两个数的商

}

void main()

{

double res;

try                                         //定义异常

{

res=fuc(2,3);

cout<<"The result of x/y is : "<<res<<endl;

res=fuc(4,0);                                //出现异常

}

catch(double)                                    //捕获并处理异常

{

cerr<<"error of dividing zero.\n";

exit(1);                                    //异常退出程序

}

}

12 程序中的错误处理:异步编程

异步编程中的错误处理

在异步编程的世界里,因为被调用的函数是被放到了另外一个线程里运行这将导致:

13 魔数 0x5f3759df 看不懂啊 放弃了 todo

先看下面这段代码

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 
    // 2nd iteration, this can be removed
    // y  = y * ( threehalfs - ( x2 * y * y ) ); 

    return y;
}

这个函数的作用是秋平方根倒数,即 x^{-1/2}
\frac{1}{\sqrt{x}}
当然,它算的是近似值,只不过这个近似值的京都很高,而且计算成本比传统的浮点数运算平方根的算法低很多。
在以前那个计算资源还不充沛的年代,在一些3D游戏场景的计算机图形学中,要求取照明和投影的光照与反射的计算。其中x,y,z是3D坐标上的一个点的三个坐标值。
\frac{1}{\sqrt{x^2}+y^{2}+z^{2}}
基本来说,在一个3D游戏中,我们每秒钟都需要做上百万次平方根倒数运算,而在计算机还不成熟的时代,这些计算都需要软件来完成,计算速度非常慢。

int main() {
    float x = 3.14;
    float y = 0.015;
    return 0;
}

在Mac上用lldb工具debug一下。

(lldb) frame variable
(float) x = 3.1400001
(float) y = 0.0149999997

(lldb) frame variable -f b
(float) x = 0b01000000010010001111010111000011
(float) y = 0b00111100011101011100001010001111

从结果上完成验证了我们的方法。

简化浮点数公式

因为浮点数表示的公式有些复杂,我们简化一下
(-1)^{S}\ast (1+\frac{M}{2^{23}})\ast 2^{(E-127)}
我们令,m = (\frac{M}{2^{23}} )e = (E-127)。因为符号位在y= x^{-\frac{1}{2}}的两端都是0(正数),也就可以去掉,所以浮点数的算式简化为:
(1+m)\ast2^{e}
上面这个算式是从一个32bits二进制计算出一个浮点数。这个32bits的整型算式是:
M+E\ast2^{23}
比如,0.015的32bits的二进制是:00111100011101011100001010001111,也就是整形的:
7717519+120\ast 2^{23}
= 1014350479
= 0X3C75C28F

平方根倒数公式推导

上一篇下一篇

猜你喜欢

热点阅读