日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

魔鬼数字_

發布時間:2023/12/29 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 魔鬼数字_ 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1,開方的近似計算 0x1fbd1df5

2,開方原理

3,開方倒數的近似計算

4,開方倒數原理

5,除法換成乘法?3435973837


進公司之前對于魔鬼數字的理解,是真魔鬼。

進公司之后發現,2也是魔鬼數字。

收錄一下真魔鬼的魔鬼數字。

1,開方的近似計算 0x1fbd1df5

float MagicSqrt(float x) {float xhalf = x / 2;int i = *(int*)&x;i = 0x1fbd1df5 + (i >> 1);return *(float*)&i; }int main() {cout << MagicSqrt(2);return 0; }

輸出1.47748

如果再加牛頓法進行精度優化:

float MagicSqrt(float x) {float xhalf = x / 2;int i = *(int*)&x;i = 0x1fbd1df5 + (i >> 1);x = *(float*)&i;x = x / 2 + xhalf / x;x = x / 2 + xhalf / x;return x; }int main() {cout << MagicSqrt(2);return 0; }

輸出1.41421

輸入5000輸出70.7107,誤差不到0.0001

2,開方原理

根據浮點數的編碼方案,可以表示成:

? ,其中s和e表示小數(0到1)和指數(-127到128)

當0<x<1時,,其中c是一個常數。

所以上式簡化成

如果把浮點數的32位比特按照int來解讀,那么絕對值就等于

所以上式化成?

用不同方法估算的c值都在0.05左右,https://www.lomont.org/papers/2003/InvSqrt.pdf

給出了0.0450465是怎么算出來的。

所以

3,開方倒數的近似計算

float rsqrt(float number) {float y = number;long i = *(long *)&y;i = 0x5f3759df - (i >> 1);y = *(float *)&i;return y; }int main() {cout << rsqrt(2);return 0; }

輸出0.716215

4,開方倒數原理

和開方原理類似,最后也是用到

其中c取0.0450465

5,除法換成乘法?3435973837

求一個5的倍數除5等于多少,可以換成乘法

int main() {cout << 100*3435973837;return 0; }

輸出20

原理很簡單:

cout << 3435973837 * 5;? 會輸出1,發生了溢出截斷。

那么這個數是怎么來的呢?也很簡單,解不定方程

最小解是

除了5之外,其他所有奇數幾乎都可以這么搞。

總結

以上是生活随笔為你收集整理的魔鬼数字_的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。