將浮點數轉換為分數

原理

double 由以下部分組成:

  1. 符號位
  2. 指數部分
  3. 尾數部分
  • 符號位的含義:為 0 表示正數,為 1 表示負數。
  • 指數部分的含義:在規格化數中,指數部分的整型值減去 1023 就是實際的指數值。在非規格化數中,指數恒為 -1022 這個常數。
  • 尾數部分:尾數部分的整型值就是它的值,不像指數部分那樣需要分別處理。

規格化數的值:
value = ( ? 1 ) sign × 2 exponent ? 1023 × ( 1 + mantissa 2 52 ) \text{value} = (-1)^{\text{sign}} \times 2^{\text{exponent} - 1023} \times \left(1 + \frac{\text{mantissa}}{2^{52}}\right) value=(?1)sign×2exponent?1023×(1+252mantissa?)

非規格化數的值:
value = ( ? 1 ) sign × 2 ? 1022 × ( mantissa 2 52 ) \text{value} = (-1)^{\text{sign}} \times 2^{-1022} \times \left(\frac{\text{mantissa}}{2^{52}}\right) value=(?1)sign×2?1022×(252mantissa?)

浮點特殊值

NaN

  • 指數部分所有位都為 1.
  • 尾數部分不為 0.

正無窮、負無窮

  • 指數部分所有位都為 1.
  • 尾數部分所有位都為 0.

則根據符號位來確定是正無窮還是負無窮。符號位為 0 則是正無窮,符號位為 1 則是負無窮。

DoubleBitView

設計一個類,用來解析 double 的位結構

#pragma once
#include "base/bit/bit.h"
#include "base/math/FloatNumberValueType.h"
#include <cstdint>namespace base
{namespace bit{class DoubleBitView{private:union Union{double _double;uint64_t _uint64;};Union _value_union{};public:constexpr DoubleBitView() = default;constexpr DoubleBitView(double value){_value_union._double = value;}constexpr double Value() const{return _value_union._double;}constexpr uint64_t AsUint64() const{return _value_union._uint64;}////// @brief 尾數部分的位。////// @return///constexpr uint64_t MantissaBits() const{return base::bit::ReadBits(_value_union._uint64, 0, 52);}////// @brief 指數部分的位。////// @return///constexpr uint64_t ExponentBits() const{return base::bit::ReadBits(_value_union._uint64, 52, 63);}////// @brief 符號位。////// @return///constexpr bool SignBit() const{return base::bit::ReadBit(_value_union._uint64, 63);}////// @brief 浮點值的類型。////// @return///constexpr base::bit::FloatNumberValueType ValueType() const{if (ExponentBits() == base::bit::ReadBits(UINT64_MAX, 52, 63)){// 指數位全為 1if (MantissaBits() != 0){// 尾數位不全為 0,return base::bit::FloatNumberValueType::NaN;}// 尾數位全為 0if (!SignBit()){// 正無窮return base::bit::FloatNumberValueType::PositiveInfinite;}// 負無窮return base::bit::FloatNumberValueType::NegativeInfinite;}// 指數位不全為 1if (ExponentBits() == 0){// 指數位全為 0return base::bit::FloatNumberValueType::Denormalized;}return base::bit::FloatNumberValueType::Normalized;}////// @brief 是正數。////// @return///constexpr bool Positive() const{// 符號位位 0 則是正數return !SignBit();}////// @brief 是負數。////// @return///constexpr bool Negative() const{// 符號位位 1 則是負數return SignBit();}};} // namespace bit
} // namespace base

分數類

有了 double 的位結構之后,分數類就可以基于它進行構造了

base::Fraction::Fraction(base::Double const &value)
{if (value.Value() == 0.0){SetNum(0);SetDen(1);return;}base::bit::DoubleBitView view{value.Value()};switch (view.ValueType()){case base::bit::FloatNumberValueType::Normalized:{base::Fraction f1 = base::pow(base::BigInteger{2},base::BigInteger{view.ExponentBits() - 1023});base::Fraction f2 = base::Fraction{view.MantissaBits(),base::pow(base::BigInteger{2}, base::BigInteger{52}),};base::Fraction value = f1 * (1 + f2);if (view.Positive()){*this = value;}else{*this = -value;}break;}case base::bit::FloatNumberValueType::Denormalized:{base::Fraction f1 = base::pow(base::BigInteger{2},base::BigInteger{-1022});base::Fraction f2 = base::Fraction{view.MantissaBits(),base::pow(base::BigInteger{2}, base::BigInteger{52}),};base::Fraction value = f1 * f2;if (view.Positive()){*this = value;}else{*this = -value;}break;}case base::bit::FloatNumberValueType::NaN:{throw std::invalid_argument{CODE_POS_STR + "此浮點數是 NaN."};}case base::bit::FloatNumberValueType::PositiveInfinite:{throw std::invalid_argument{CODE_POS_STR + "此浮點數是正無窮。"};}case base::bit::FloatNumberValueType::NegativeInfinite:{throw std::invalid_argument{CODE_POS_STR + "此浮點數是負無窮。"};}default:{throw std::runtime_error{CODE_POS_STR + "非法的枚舉值。"};}}
}

無損地將標準庫中的 π \pi π 常數轉換為分數

#include "base/math/Fraction.h"
#include "base/wrapper/number-wrapper.h"
#include <cmath>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <numbers>
#include <stdlib.h>int main()
{{base::Fraction f{base::Double{std::numbers::pi}};constexpr int precision = 512;std::cout << "分數: " << f << std::endl;std::cout << "std::numbers::pi: \t\t"<< std::setprecision(precision)<< std::numbers::pi<< std::endl;std::cout << "分數表示的 pi 轉為 double: \t"<< std::setprecision(precision)<< static_cast<double>(f)<< std::endl;std::cout << "誤差: "<< std::setprecision(precision)<< static_cast<double>(f) - std::numbers::pi<< std::endl;}
}

運行結果

分數: 884279719003555 / 281474976710656
std::numbers::pi:               3.141592653589793115997963468544185161590576171875
分數表示的 pi 轉為 double:      3.141592653589793115997963468544185161590576171875
誤差: 0

在這里插入圖片描述

π \pi π 用分數近似表示就是 884279719003555 / 281474976710656

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

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

相關文章

前端實現截圖的幾種方法

前端實現截圖的幾種方法 前端實現截圖功能有多種方式&#xff0c;下面我將介紹幾種常用的方法及其實現方案。 1. 使用 html2canvas 庫 html2canvas 是最流行的前端截圖解決方案之一&#xff0c;它可以將 DOM 元素轉換為 canvas。 基本用法 import html2canvas from html2c…

TDengine 與開源可視化編程工具 Node-RED 集成

簡介 Node-RED 是由 IBM 開發的基于 Node.js 的開源可視化編程工具&#xff0c;通過圖形化界面組裝連接各種節點&#xff0c;實現物聯網設備、API 及在線服務的連接。同時支持多協議、跨平臺&#xff0c;社區活躍&#xff0c;適用于智能家居、工業自動化等場景的事件驅動應用開…

OpenCV——圖像形態學

圖像形態學 一、像素的距離二、像素的鄰域三、膨脹與腐蝕3.1、結構元素3.2、腐蝕3.3、膨脹 四、形態學操作4.1、開運算和閉運算4.2、頂帽和黑帽4.3、形態學梯度4.4、擊中擊不中 一、像素的距離 圖像中像素之間的距離有多種度量方式&#xff0c;其中常用的有歐式距離、棋盤距離…

在Django中把Base64字符串保存為ImageField

在數據model中使用ImageField來管理avatar。 class User(models.Model):AVATAR_COLORS ((#212736, Black),(#2161FD, Blue),(#36B37E, Green),(#F5121D, Red),(#FE802F, Orange),(#9254DE, Purple),(#EB2F96, Magenta),)def generate_filename(self, filename):url "av…

使用 R 處理圖像

在 R 中進行圖像處理&#xff0c;使用像 imager 這樣的包&#xff0c;可以實現強大的數字圖像分析和處理。本博客將基于"圖像數據分析"文檔的概念&#xff0c;演示使用 imager 包進行的關鍵技術——圖像增強、去噪和直方圖均衡化&#xff0c;并通過可視化結果展示這些…

一命速通Prometheus+Grafana+Consul+VictoriaMetrics

Prometheus業務 搭建及使用 注意&#xff1a;優先看完提供的博客鏈接&#xff0c;可以快速了解該工具的功能及其搭建和使用。 prometheusgrafana 一、PrometheusGrafana普羅米修斯&#xff0c;搭建和使用_普羅米修斯 grafana-CSDN博客 ./prometheus --config.fileprometheus.ym…

螞蟻百寶箱快速創建智能體AI小程序

螞蟻百寶箱官網https://tbox.alipay.com/community?operationSource1006/ 以下是一篇關于螞蟻百寶箱快速創建智能體 AI 小程序的圖文并茂的博客&#xff1a; 標題&#xff1a;螞蟻百寶箱快速創建智能體 AI 小程序&#xff0c;開啟智能應用新體驗 引言 在數字化飛速發展的當…

大模型面試題:RL Scaling Law 中的“過優化”現象及其緩解方法是啥?

更多面試題&#xff0c;請看 大模型面試題總結-CSDN博客 或者 https://gitee.com/lilitom/ai_interview_questions/blob/master/README.md 最好將URL復制到瀏覽器中打開&#xff0c;不然可能無法直接打開 ---------------------------------------------------------------…

Filecoin系列 - IPLD 技術分析

1. 用途 1.1 存儲數據 為了成功地將數據加到 Filecoin 網絡, 需要成功完成以下步驟: 客戶端導入數據生成CAR文件: 數據必須打包成 CAR file (內容可尋址檔案) - CAR是IPLD規范的序列化歸檔文件.存儲交易: 存儲供應商和客戶之間的存儲交易必須由客戶發起, 并由存儲供應商接受…

Apptrace如何幫我精準追蹤移動廣告效果?

開發者視角&#xff1a;Apptrace如何幫我精準追蹤移動廣告效果&#xff1f;?? 作為獨立開發者&#xff0c;我最頭疼的就是?“廣告投放到底有沒有用&#xff1f;”?——錢花出去了&#xff0c;用戶是刷量機器人還是真實用戶&#xff1f;哪個渠道的ROI最高&#xff1f;Apptr…

【MySQL篇07】:redo log日志與buffer pool詳解

文章目錄 1. Buffer Pool 緩沖池2. redo log (重做日志)redo log 的作用&#xff1a;為什么需要 redo log buffer&#xff1f;什么時候刷盤呢&#xff1f; 3. 總結一下 redo log 和 Buffer Pool 在更新數據時的協同工作關鍵組件關系圖刷盤完成后 1. Buffer Pool 緩沖池 首先&a…

Qt Library庫系列----Serial串口

前言 每次寫串口相關的功能時&#xff0c;總是需要重新寫或者復制原來寫過的文件&#xff0c;容易出錯不說&#xff0c;這也不是碼農的風格&#xff0c;所以還是得有一套自己得代碼庫&#xff0c;方便調用&#xff0c;又能保持神秘感。 一、開發需求 1.有個實例類&#xff1b;…

第八節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 用戶管理(下)

Vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) 快速入門 - 對接后端登錄接口(上) ? 第四節:Vben Ad…

Redis 性能瓶頸時如何處理?

當 Redis 遇到性能瓶頸時&#xff0c;需要從多個維度進行排查和優化。以下是系統化的解決方案&#xff0c;涵蓋硬件、配置、數據模型、網絡等關鍵點&#xff1a; 一、硬件資源優化 內存瓶頸 現象&#xff1a;頻繁觸發 OOM 或 used_memory 接近物理內存。解決&#xff1a; 升級服…

多相機三維人臉掃描儀:超寫實數字人模型制作“加速器”

超寫實數字人&#xff0c;又稱“數字分身”&#xff0c;是以真人形象為原型構建的高仿真虛擬形象&#xff0c;按維度可分為2D數字人與3D數字人。這類數字人已廣泛應用于影視制作、游戲交互、品牌直播等場景&#xff0c;其核心價值在于通過技術手段實現真人形象的數字化復刻&…

ceph 自動調整 pg_num

要讓 Ceph 的 pool 自動調整 pg_num(PG 數量),你需要啟用 PG autoscaler。這是從 Ceph Octopus(15.x) 開始引入的功能,能根據池的容量和對象數量自動建議或調整 pg_num,以實現負載均衡。 ? 一步步開啟 Pool 的 pg_num 自動調整 1. 啟用 PG autoscaler 模塊(通常默認啟…

Python Beautiful Soup 4【HTML/XML解析庫】 簡介

全面剖析大模型 圖解大模型&#xff1a;生成式AI原理與實戰 大語言模型大模型應用開發Transformer DeepSeek模型原理開發深度學習 圖靈出品 大模型強化學習詳解 大模型算法&#xff1a;強化學習、微調與對齊&#xff08;全彩&#xff09;詳解強化學習 RLHF GRPO DPO SFT CoT D…

AI Agent開發與安全

AI Agent的核心演進 Level 1&#xff1a;LLM Agent&#xff08;聊天機器人&#xff09; 特點&#xff1a;靠提示詞工程賦予人設&#xff08;如星座占卜、角色扮演&#xff09;&#xff0c;但存在幻覺問題&#xff0c;輸出不可控。局限&#xff1a;娛樂性強&#xff0c;難勝任嚴…

NumPy玩轉數據科學

本文在創作過程中借助 AI 工具輔助資料整理與內容優化。圖片來源網絡。 文章目錄 一、引言二、NumPy 概述2.1 NumPy 的定義與發展2.2 NumPy 的重要性 三、NumPy 的多維數組支持3.1 多維數組的概念3.2 多維數組的創建與操作3.2.1 數組的創建3.2.2 數組的索引和切片3.2.3 數組的運…

【uniapp小程序開發】圖表組件ucharts的使用(入門)

一、插件的安裝 安裝非常簡單&#xff0c;打開uniapp的插件市場&#xff0c;導入到項目中即可 下載地址&#xff1a;https://ext.dcloud.net.cn/plugin?id271 二、開始實踐 先看頁面的效果 頁面中實現了三個基本圖形的展示&#xff1a;折線圖、餅圖和柱狀圖。 上圖左一&a…