《深入理解計算機系統》學習筆記 - 第四課 - 浮點數

Floating Point 浮點數

文章目錄

  • Floating Point 浮點數
    • 分數二進制示例
    • 能代表的數
    • 浮點數的表示方式
      • 浮點數編碼
        • 規格化值
          • 規格化值編碼示例
        • 非規格化的值
        • 特殊值
    • 示例
    • IEEE 編碼的一些特殊屬性
    • 四舍五入,相加,相乘
      • 四舍五入
        • 四舍五入的模式
        • 二進制數的四舍五入
    • 浮點數乘積
    • 浮點數加法
    • 浮點數的一些數學性質
    • 浮點數在C中
      • 類型轉換的比較
    • 《深入理解計算機系統》書籍學習筆記

浮點主要通過移動二進制小數點來表示盡可能大的取值范圍,兼顧盡可能高的精度,同時還要受到位數有限的限制。

分數二進制示例

值          二進制表示       十進制
5  3/4      101.11           2^2 + 2^0 + 1/2^1 + 1/2^2 
2  7/8      10.111           2^1 + 1/2^1 + 1/2^2 + 1/2^3
1  7/16     1.0111           2^0 + 1/2^2 + 1/2^3 + 1/2^4
  • 分數除以2,就是小數點二進制右移1位。
  • 乘以2, 就是小數點左移1位
  • 數字0.111111111… 小于 1,無限接近于1
    • 1/2 + 1/4 + 1/8 + … + 1/2^i + … -> 1.0
    • 記為 1.0 - ε

能代表的數

  • 只能精確地表示x/2k形式的數字

  • 其他有理數有重復的位表示

值      二進制表達                      十進制
1/3     0.01010101010101[01]...         1/2^2 + 1/2^4 + 1/2^6 + 1/2^8 + ...
1/5     0.001100110011[0011]...         1/2^3 + 1/2^4 + 1/2^7 + 1/2^8 + ...
1/10    0.0001100110011[0011]...        1/2^4 + 1/2^5 + 1/2^8 + 1/2^9 + ...

浮點數的表示方式

同一標準:

(–1)^s*M*2^E

看著是不是像二進制科學計數法。

  • 符號位s: 決定了數是正數還是負數
  • 顯著值M(mantissa,小數部分): 通常是在[1.0,2.0]范圍內的分數值。
  • 指數E(exponent): 以2的冪表示值的權重

浮點數編碼

在這里插入圖片描述

  • s 符號位
  • exp 字段編碼E(但是不等于E)
  • frac 字段編碼M (但是不等于M)

不同精度:

  • 單精度:32 位(bits)
    字段所占位數: s:exp:frac -> 1:8:23

  • 雙精度: 64 位(bits)
    字段所占位數: s:exp:frac -> 1:11:52

規格化值

當exp != 000…0 , 并且exp != 111…1

指數編碼有一個偏置值:E = Exp - Bias
Exp : exp字段,無符號值
Bias = 2^(k-1) -1
k 表示指數的位數

  • 取值范圍
    單精度:k=8, Bias = 2^(8-1) - 1 = 127 (1 <= Exp <= 254, -126 <= E <= 127)
    雙精度: k=11,Bias = 2^(11-1) - 1 = 1023 (1 <= Exp <= 2046, -1022 <= E <= 1023)

  • 用隱含前導編碼的有效數 1: M = 1.xxxxxx 二進制
    xxxxx: 表示frac 字段編碼
    最小值:frac = 000…0(M=1.0)
    最大值:frac = 111…1(M=2.0-ε)

注意: M 是固定前面有一個1,所以最小值才是1開始。

規格化值編碼示例

  • Float F = 15213.0
    15213 十進制 = 11101101101101 二進制
    = 1.1101101101101 * 2^13 科學計數法

  • 有效數
    M(小數) = 1.1101101101101 二進制
    frac(小數部分編碼) = 1101101101101 0000000000 二進制

  • 指數
    E = 13
    Bias = 127
    Exp = 140 = 10001100 二進制

  • 結果
    在這里插入圖片描述

非規格化的值

非規格化條件:exp = 000…0

指數值:E = 1 - Bias(注意:不是E = 0 - Bias)
以隱含前導0編碼的有效數:M = 0.xxx…x

案例:

  • exp = 000…0, frac = 000…0
    代表0值
  • exp = 000…0, frac != 000…0
    最接近0.0的數字。
    平均間隔。
特殊值

特殊值條件:exp = 111…1

案例:

  • exp = 111…1, frac = 000…0
    代表無窮大。
    操作溢出。
    例如:正無窮大:1.0/0.0 = -1.0/-0.0 , 負無窮大:1.0/-0.0

  • exp = 111…1, frac != 000…0
    Not-a-Number(NaN)
    表示無法確定數值時的情況。
    例如:sqrt(-1), 無窮大*0

示例

我們用簡單的8位浮點數表示法,來理解浮點數。
在這里插入圖片描述

s: 1位符號位
exp: 4位指數位, 偏置位bias=2^(4-1)-1=7
frac: 3位小數位

s exp  frac E Value                 計算                                        備注
0 0000 000 -6 0                     (-1)^0 * 0 * 2^(-6)
0 0000 001 -6 1/8*1/64 = 1/512      (-1)^0 * 2^(-3) * 2^(-6)                    // 最接近0值
0 0000 010 -6 2/8*1/64 = 2/512      (-1)^0 * 2^(-2) * 2^(-6)        
…
0 0000 110 -6 6/8*1/64 = 6/512      (-1)^0 * 2^(-1)*2^(-2) * 2^(-6)  
0 0000 111 -6 7/8*1/64 = 7/512      (-1)^0 * 2^(-1)*2^(-2)* 2^(-3) * 2^(-6)     // 最大的非規格化值
0 0001 000 -6 8/8*1/64 = 8/512      (-1)^0 * 1 * 2^(-6)                             // 最小的規格化值
0 0001 001 -6 9/8*1/64 = 9/512      (-1)^0 * (1 + 2^(-3)) * 2^(-6)  
…
0 0110 110 -1 14/8*1/2 = 14/16      (-1)^0 * (1 + 2^(-1)*2^(-2)) * 2^(-1)  
0 0110 111 -1 15/8*1/2 = 15/16      (-1)^0 * (1 + 2^(-1)*2^(-2)* 2^(-3)) * 2^(-1)                // 最接近1的(小于1的數)
0 0111 000 0  8/8*1 = 1             (-1)^0 * 1 * 2^0
0 0111 001 0  9/8*1 = 9/8           (-1)^0 * (1 + 2^(-3)) * 2^0                // 最接近1的(大于1的數)
0 0111 010 0  10/8*1 = 10/8         (-1)^0 * (1 + 2^(-2)) * 2^0
…
0 1110 110 7  14/8*128 = 224        (-1)^0 * (1 + 2^(-1)*2^(-2)) * 2^7
0 1110 111 7  15/8*128 = 240        (-1)^0 * (1 + 2^(-1)*2^(-2)* 2^(-3)) * 2^7             // 最大的規格化數
0 1111 000 7  inf                   

值的計算公式:v = (–1)^s * M * 2^E
規格化數: E = Exp – Bias
非規格化數: E = 1 – Bias

IEEE 編碼的一些特殊屬性

  • 浮點數(FP)的0值和整型0值一樣
    所有的位都是0

  • 除了非數字(NaN)之外,你可以比較任何浮點數。
    當作無符號數來比較。

四舍五入,相加,相乘

四舍五入

基本思想:

  • 先計算得到一個準確的值
  • 然后根據你期望的精度進行處理
    • 如果指數太大的化,可能會溢出
    • 可能需要四舍五入來滿足小數位數(frac)
四舍五入的模式
                $1.40   $1.60   $1.50   $2.50   –$1.50
向0舍入         $1      $1      $1      $2      –$1
向下舍入        $1      $1      $1      $2      –$2
向上舍入        $2      $2      $2      $3      –$1
向偶數舍入      $1      $2      $2      $2      –$2

向0舍入:向0的方向舍去小數。
向下舍入:類似向下取整
向上舍入:類似向上取整
向偶數舍入:在四舍五入的基礎上,考慮向偶數靠近,主要是在中位數時的處理方式和四舍五入不同。

二進制數的四舍五入

奇數是1,0是偶數。
二進制中間數100…,十進制中間數是500…

精度時小數后兩位:

Value   Binary  Rounded     Action  Rounded     Value
2       3/32    10.000112   10.002  (<1/2—down) 2
2       3/16    10.001102   10.012  (>1/2—up)   2 1/4
2       7/8     10.111002   11.002  ( 1/2—up)   3
2       5/8     10.101002   10.102  ( 1/2—down) 2 1/2

浮點數乘積

相乘:((–1)^s1 * M1 * 2^E1) x ((–1)^s2 * M2 * 2^E2)
準確值:: (–1)^s * M * 2^E
符號位 s: s1 ^ s2
有效位 M: M1 x M2
指數位 E: E1 + E2

修正:

  • 如果 M >= 2, M 右移,增加E
  • 如果E 超出范圍,溢出
  • 四舍五入 M 來符合精度要求。

浮點數加法

相加:((–1)^s1 * M1 * 2^E1) + ((–1)^s2 * M2 * 2^E2)
假設:E1 > E2

準確值:: (–1)^s * M * 2^E
符號位 s, 有效位 M: 對齊相加
指數位E: E1

修正:

  • 如果 M >= 2, 右移M, 增加E。(小數點右移)
  • 如果 M < 1, 左移 M 的 k 個位置, 減少 E 的 k。(小數點左移)
  • 如果E超出范圍溢出
  • 將 M 適應小數(frac)精度

浮點數的一些數學性質

浮點數加法的數學性質:

  • 與阿貝爾群的比較
    • 加法封閉: 滿足
      • 但是可能產生 無窮大和NaN
    • 結合律:滿足
    • 交換律:不滿足
      • 進行四舍五入時,可能溢出和不精確
      • (3.14+1e10)-1e10 = 0, 3.14+(1e10-1e10) = 3.14
      • 每個元素都有可加逆:幾乎滿足
        • 除了無窮大和NaN
  • 單調性
    • a ≥ b ? a+c ≥ b+c : 幾乎滿足
      • 除了無窮大和NaN

浮點數乘法的數學性質和加法是類似的。

浮點數在C中

無符號和有符號的轉換,從未改變過位的表示(位上的實際值),只是改變了某些位的解釋方式。

整數,單精度浮點數,雙進度浮點數的轉換,位的表示發生了變化(實際值改變了),會對位的值產生實際影響。

  • double/float -> int
    • 截取小數部分
    • 就像向0舍入
  • int -> double
    精確的轉換,只要int(32) <= 53 位大小。
  • int -> float
    將會進行四舍五入操作。

類型轉換的比較

三個不同類型的變量:

int x = …;
float f = …;
double d = …;

一些特性的比較:

* x == (int)(float) x           // false
? x == (int)(double) x          // true
? f == (float)(double) f        // true
? d == (double)(float) d        // false
? f == -(-f);                   // true
? 2/3 == 2/3.0                  // false. 2/3=0 整數, 2/3.0 是浮點數。
? d < 0.0 ? ((d*2) < 0.0)       // true, 浮點數即使溢出也是負無窮大數
? d > f ? -f > -d               //  true, 單調性
? d * d >= 0.0                  // true 
? (d+f)-d == f                  // false, 不滿足結合律

《深入理解計算機系統》書籍學習筆記

《深入理解計算機系統》學習筆記 - 第一課 - 課程簡介
《深入理解計算機系統》學習筆記 - 第二課 - 位,字節和整型
《深入理解計算機系統》學習筆記 - 第三課 - 位,字節和整型
《深入理解計算機系統》學習筆記 - 第四課 - 浮點數
《深入理解計算機系統》學習筆記 - 第四課 - 機器級別的程序

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/212532.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/212532.shtml
英文地址,請注明出處:http://en.pswp.cn/news/212532.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Qt5】setWindowFlags的標志有哪些?

2023年12月9日&#xff0c;周六晚上 窗口類型&#xff1a; Widget&#xff08;0x00000000&#xff09;&#xff1a;普通窗口部件。Window&#xff08;0x00000001&#xff09;&#xff1a;標準窗口。Dialog&#xff08;0x00000002 | Window&#xff09;&#xff1a;對話框&#…

UI自動化Selenium 鼠標滑動懸停到指定元素

ActionChains執行原理 他是按照設計好的動作順序鏈式執行&#xff1b; 當調用ActionChains的方法時&#xff0c;不會立即執行&#xff0c;只是將要做的動作安裝順序存放在隊列中&#xff1b;當調用perform()方法時&#xff0c;隊列中的方法會依次執行&#xff1b; from sele…

西南科技大學數字電子技術實驗三(MSI邏輯器件設計組合邏輯電路及FPGA的實現)預習報告

一、計算/設計過程 說明:本實驗是驗證性實驗,計算預測驗證結果。是設計性實驗一定要從系統指標計算出元件參數過程,越詳細越好。用公式輸入法完成相關公式內容,不得貼手寫圖片。(注意:從抽象公式直接得出結果,不得分,頁數可根據內容調整) 1、4位奇偶校驗器 真值表 …

C++ Qt開發:使用關聯容器類

當我們談論編程中的數據結構時&#xff0c;順序容器是不可忽視的一個重要概念。順序容器是一種能夠按照元素添加的順序來存儲和檢索數據的數據結構。它們提供了簡單而直觀的方式來組織和管理數據&#xff0c;為程序員提供了靈活性和性能的平衡。 Qt 中提供了豐富的容器類&…

AI:大模型技術

Prompt Prompt&#xff08;提示&#xff09;是一種在人工智能領域&#xff0c;特別是在自然語言處理和聊天機器人中常用的技術。它是一種輸入&#xff0c;用于激發人工智能模型生成相應的輸出。在聊天機器人中&#xff0c;用戶輸入的問題或請求就是提示&#xff0c;而聊天機器…

基于AidLux的工業視覺少樣本缺陷檢測實戰應用

1. 模型轉換 AIMO網站&#xff1a; http://aimo.aidlux.com/ 試用賬號和密碼&#xff1a; 賬號&#xff1a;AIMOTC001 &#xff0c;密碼&#xff1a;AIMOTC001 上傳模型選擇目標平臺參數設置選擇自動轉換轉換結果并下載 2. 基于AidLux的語義分割模型部署 dataset2aidlux文件…

期待一下elasticsearch還未發布的8.12版本,由lucene底層帶來的大幅度提升

現在是北京時間23年12月10日。當前es最新版本還是es8.11版本。我們可以期待一下不久的將來&#xff0c;es的8.12版本看到大幅度的檢索性能提升。受益于 Lucene 9.9版本&#xff0c;內核帶來的大幅提升&#xff01; 此次向量檢索利用底層指令fma會性能提升5%。并且還提供了向量點…

在Spring Cloud使用Hystrix核心組件,并注冊到Eureka注冊中心去

其實吧&#xff0c;寫Spring Cloud系列&#xff0c;我有時候覺得也挺難受的&#xff0c;因為Spring Cloud的微服務啟動都需要一個一個來&#xff0c;并且在IDea中也需要占用比較大的內存&#xff0c;并且我本來可以一篇寫完5大核心組件的&#xff0c;但是我卻分了三篇&#xff…

簡單的圖像分類任務全流程示例(內含代碼)

以下是一個簡單的示例&#xff0c;展示了如何使用 PyTorch 處理自定義圖像分類數據集&#xff1a; import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from torch.utils.data import DataLoad…

erlang實現用ets做一級緩存

一、Erlang中的ETS表和DETS表 ETS表是Erlang中的一種數據結構&#xff0c;它允許我們在內存中存儲數據。ETS表有許多用途&#xff0c;其中包括作為緩存的一種實現方式。ETS表的特點是它們在內存中以表的形式存儲數據&#xff0c;這使得訪問和操作數據非常快。 DETS表是Erlang…

【求職】外企德科-網易游戲測試面試記錄

前面的話&#xff1a;本來沒想寫&#xff0c;但是竟然收到了一面通過的通知&#xff0c;那就來回顧一下一面&#xff0c;為終面做做準備。 這次面試基本沒有做什么準備&#xff0c;本來也就是抱著試一試的心態做的筆試&#xff0c;結果筆試通過了&#xff0c;由于筆試的內容很…

LINUX-ROS集成安裝MQTT庫步驟注意事項

環境信息 roottitan-ubuntu1:/home/mogo/data/jp/paho.mqtt.cpp# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 步驟 安裝doxygen sudo apt install doxygen 構…

Fcopy: 基于Coke實現內網大文件分發

在工作中&#xff0c;我曾與小伙伴討論過這樣一個實際問題&#xff1a;數據制作流程產生了一份需要上線的文件&#xff0c;而線上有數十臺甚至上百臺機器&#xff0c;有什么樸素的辦法以盡可能快的速度將文件分發到指定的機器上嗎&#xff1f;根據作者已有的知識&#xff0c;分…

普冉(PUYA)單片機開發筆記(5): 配置定時器PWM輸出

概述 定時器的輸出通道作為 PWM 驅動是 MCU 的常用功能。 PY32F003 有一個高級定時器 TIM1 和一個通用定時器 TIM3&#xff0c;這兩個定時器都可以驅動4個輸出通道。現在我們就利用 TIM1 的某一個通道實現可控占空比的 PWM 輸出。 原理簡介 看數據手冊&#xff0c;簡單摘錄…

激活函數數學詳解以及應用場景解釋

文章目錄 激活函數1. Sigmoid 激活函數例子及推導過程代碼 2. ReLU 激活函數例子及推導過程 3. Tanh 激活函數例子及推導過程代碼 4. Softmax 激活函數例子及推導過程代碼 CNN 中的卷積層工作原理卷積計算過程卷積后的輸出及 ReLU 應用 激活函數 激活函數在神經網絡中扮演著至…

IPSec 協議

在 TCP/IP 協議中&#xff0c;對 IP 數據包沒有提供任何安全保護&#xff0c;攻擊者可以通過網絡嗅探、 IP 欺騙、連接截獲等方法來攻擊正常的 TCP/IP 通信。因此&#xff0c;通信過程中會存在以下危險&#xff1a;數據并非來自合法的發送者、數據在傳輸過程中被非法篡改、信息…

前端知識(十七)——入口函數和特定函數的區別

入口函數和特定函數是編程中常見的兩種函數類型&#xff0c;它們在功能和使用場景上有所不同。下面我將通過Python代碼示例來解釋它們的區別。 1.入口函數&#xff1a;入口函數通常是一個程序或模塊的起始點&#xff0c;它負責接收用戶輸入或外部數據&#xff0c;并啟動程序的…

DM8/達夢 數據庫管理員使用手冊詳解

1.1DM客戶端存放位置 Windows&#xff1a;DM數據庫安裝目錄中tool文件夾和bin文件夾中。 Linux&#xff1a;DM數據庫安裝目錄中tool目錄和bin目錄中。 1.2DM數據庫配置助手 1.2.1Windows創建數據庫 打開數據庫配置助手dbca 點擊創建數據庫實例 選擇一般用途 瀏覽選擇數據庫…

圖中的最長環

說在前面 &#x1f388;不知道大家對于算法的學習是一個怎樣的心態呢&#xff1f;為了面試還是因為興趣&#xff1f;不管是處于什么原因&#xff0c;算法學習需要持續保持&#xff0c;今天讓我們一起來看看這一道題目————圖中的最長環&#xff0c;圖論題目中比較常見的環路…

vite+TypeScript+vue3+router4+Pinia+ElmPlus+axios+mock項目基本配置

1.viteTSVue3 npm create vite Project name:... yourProjectName Select a framework:>>Vue Select a variant:>>Typescrit2. 修改vite基本配置 配置 Vite {#configuring-vite} | Vite中文網 (vitejs.cn) vite.config.ts import { defineConfig } from vite …