当前位置: 首页 > wzjs >正文

讯响模板网站一个网站如何推广

讯响模板网站,一个网站如何推广,深圳相册制作,校园活动策划案的范文原理 double 由以下部分组成: 符号位指数部分尾数部分 符号位的含义:为 0 表示正数,为 1 表示负数。指数部分的含义:在规格化数中,指数部分的整型值减去 1023 就是实际的指数值。在非规格化数中,指数恒为…

原理

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×2exponent1023×(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×21022×(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.dtcms.com/wzjs/794252.html

相关文章:

  • 做网站 公司有哪些太原网站建设注意
  • 东营网站建设报价竞价托管推广代运营
  • 网络推广网站排行榜山东住房与城乡建设部网站
  • 湖里区建设局网站百度推广免费
  • 海珠区建网站怎么做网站 高中信息技术
  • 建造网站的软件网站建设指引
  • 网站建站中关键字搜索怎么弄wordpress 微信编辑器插件下载
  • 画网站 模板宣传平台的软件有哪些
  • 影视网站怎么做原创先建网站还是先做app好
  • 汽车租赁网站设计学校门户网站流程建设方案
  • 建网站怎么避免备案aso优化
  • php 判断 $_get 然后跳转到相印的网站wordpress 粉丝
  • 台州网站建设惠店科技网上购物哪个商城好
  • 建设网站公司选哪家好网站开发技术可行性
  • ftp网站建立建设项目公告网站
  • 手机怎么自己设计图片排名网站优化培训
  • wordpress拍卖插件中文seo站内优化公司
  • asp网站路径射阳做网站
  • 购物网站建设案例微信小程序入口登录
  • 沈阳双兴建设集团有限公司网站泉州建设网站开发
  • 南山商城网站建设多少钱网页欣赏网站
  • 网站建设是属于虚拟产品吗天蝎做网站建网站
  • 188旅游网站源码下载影视软件开发定制
  • 电子商务网站建设方案案例网站制作公司怎样帮客户做优化
  • 邯郸公司做网站渭南建设工程招标投标网站
  • 论坛网站建设费用站长查询工具
  • 抚顺网站建设推荐嘉兴网站制作策划
  • 一个外国人做汉字网站百度网站服务器
  • 台州企业网站0基础做电商从何下手
  • 注册网站域名多少钱一年江山做网站