news 2026/6/10 21:55:27

数值计算: IEEE754浮点数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数值计算: IEEE754浮点数

文章目录

  • IEEE754浮点数
      • 单精度(float,32bits)
      • 双精度(double,64bits)
      • 浮点数加减法流程逻辑
        • 工具程序

IEEE754浮点数

What Every Computer Scientist Should Know About Floating-Point Arithmetic

一个浮点数包括三部分: 符号部分(Sign)、指数部分(Exponent)、分数部分(Fraction)

  • IEEE754浮点数不是均匀分布的。仅能代表有限个数的实数。数轴上有空隙,多数浮点数是不能被精确表示的,比如是十进制数0.1就不能被IEEE754浮点数精确表示
  • 对于normal浮点数,1.xxxx中的1是隐含存在的
  • normal浮点数0有正负之分(S=0/1, E=0, Fraction=0). 函数atan2(y,x)按IEEE-754标准x取正0和负0,结果对应π \piπ− π -\piπ(Intel Fortran和Matlab中的atan2函数对正负零的处理有不同之处)
  • 有subnormal数(非常小,接近数值0): E=0, Fraction部分不为0
  • IEEE754浮点数内部计算寄存器多出两位(保证gaurd & rounding)(guard bits是三位?)
  • 有四种截断/舍入模式(rounding)
  • 有overflow/underflow浮点计算异常。underflow危害不大,overflow需要特殊关注。overflow一个情形是从其他类型转换引起的(e.g.,一个很大的整数转成float, 或double转成float), 另外一个教科书级例子是hypot计算x 2 + y 2 \sqrt{x^2+y^2}x2+y2, 和求多维向量长度∑ x i 2 \sqrt{\sum{x_i^2}}xi2, 类似计算要时刻避免浮点overflow溢出!
  • 比较: inf>1, 返回1; NaN>1、NaN==1、NaN<1都返回0
  • 对于subnormal数一般有两种处理方式: flush to zero .vs. gradual underflow。subnormal数对性能影响较大,可以指定编译选项打开或关闭flush to zero;gradual underflow一般对比较精细计算中有帮助,比如求函数数值导数等。

单精度浮点数可表示范围:


单精度(float,32bits)

说明
Bias127
E范围[1…254], 0和255保留
Range2 − 126 2^{-126}2126to2 + 127 2^{+127}2+127

一些特殊单精度数(调用std::numeric_limits<float>获取)

浮点数二进制表示
000000000000000000000000000000000
-010000000000000000000000000000000
100111111100000000000000000000000
-110111111100000000000000000000000
eps00110100000000000000000000000000
1+eps00111111100000000000000000000001
min00000000100000000000000000000000
max01111111011111111111111111111111
denorm_min00000000000000000000000000000001
infinity01111111100000000000000000000000
sNaN01111111101000000000000000000000
qNaN01111111110000000000000000000000

双精度(double,64bits)

说明
Bias1023
E范围[1…2046], 0和2047保留
Range2 − 1022 2^{-1022}21022to2 + 1023 2^{+1023}2+1023

一些特殊双精度数(调用std::numeric_limits<double>获取)

浮点数二进制表示
00000000000000000000000000000000000000000000000000000000000000000
-01000000000000000000000000000000000000000000000000000000000000000
10011111111110000000000000000000000000000000000000000000000000000
-11011111111110000000000000000000000000000000000000000000000000000
eps0011110010110000000000000000000000000000000000000000000000000000
1+eps0011111111110000000000000000000000000000000000000000000000000001
min0000000000010000000000000000000000000000000000000000000000000000
max0111111111101111111111111111111111111111111111111111111111111111
infinity0111111111110000000000000000000000000000000000000000000000000000
sNaN0111111111110100000000000000000000000000000000000000000000000000
qNaN0111111111111000000000000000000000000000000000000000000000000000

浮点数加减法流程逻辑

工具程序
/************************************ 测试IEEE浮点数标准、表示形式等 *************************************/#include<cmath>#include<iostream>#include<bitset>#include<limits>#include<type_traits>#include<cstdint>#include<sstream>#include<string>using namespace std;template<typename R>std::ostream&dump_bits(constR x,std::ostream&os=std::cout){uint8_t*u8=(uint8_t*)&x;strings("");//assume little-endianfor(inti=sizeof(R)-1;i>=0;--i){std::bitset<8>b(u8[i]);s+=b.to_string();}os<<s;returnos;}template<typename R>std::ostream&dump_hex(constR x,std::ostream&os=std::cout){os<<std::hexfloat;os<<x;os<<std::defaultfloat;returnos;}template<typename T>voidprint_limits(){using flimits=numeric_limits<T>;cout<<"radix:\t"<<flimits::radix<<"\n";cout<<"min_exponent:\t"<<flimits::min_exponent<<"\n";cout<<"max_exponent:\t"<<flimits::max_exponent<<"\n";cout<<"digits:\t"<<flimits::digits<<"\n";cout<<"digits10:\t"<<flimits::digits10<<"\n";cout<<"epsilon:\t"<<flimits::epsilon()<<"\n";cout<<"inf:\t"<<flimits::infinity()<<"\n";cout<<"qNan:\t"<<flimits::quiet_NaN()<<"\n";cout<<"sNan:\t"<<flimits::signaling_NaN()<<"\n";cout<<"min:\t"<<flimits::min()<<"\n";cout<<"max:\t"<<flimits::max()<<"\n";}template<typename T>voidprint_bits_and_hex(){static_assert(std::is_same_v<T,float>||std::is_same_v<T,double>||std::is_same_v<T,longdouble>);using flimits=numeric_limits<T>;autodump=[](std::ostream&os,string name,constT&x)->std::ostream&{os<<name<<"\t";dump_bits(x,os);os<<" ";os<<std::hexfloat;os<<x;os<<std::defaultfloat;os<<"\n";returnos;};dump(cout,"infinity",flimits::infinity());dump(cout,"sNaN",flimits::signaling_NaN());dump(cout,"qNaN",flimits::quiet_NaN());dump(cout,"0",T(0.0));dump(cout,"-0",T(-0.0));dump(cout,"1",T(1));dump(cout,"-1",T(-1));dump(cout,"eps",flimits::epsilon());dump(cout,"1+eps",flimits::epsilon()+T(1));dump(cout,"min",flimits::min());dump(cout,"max",flimits::max());dump(cout,"denorm_min",flimits::denorm_min());}intmain(intargc,char**argv){cout<<R"(=========================================================================单精度浮点数(float)limits=========================================================================)"<<"\n";print_limits<float>();cout<<R"(=========================================================================双精度浮点数(double)limits=========================================================================)"<<"\n";print_limits<double>();cout<<R"(=========================================================================单精度浮点数(float)二进制模式=========================================================================)"<<"\n";print_bits_and_hex<float>();cout<<R"(==========================================================================双精度浮点数(double)二进制模式==========================================================================)"<<"\n";print_bits_and_hex<double>();cout<<R"(==========================================================================长精度浮点数(longdouble)二进制模式==========================================================================)"<<"\n";print_bits_and_hex<longdouble>();//=======================================================================//inf可和其他结果比较cout<<((numeric_limits<float>::infinity()>1.0f)?"inf>1":"inf<=1")<<"\n";//inf参加运算,结果是infcout<<numeric_limits<float>::infinity()/2.0f<<"\n";//nan和其他数值比较,结果都为falsecout<<(numeric_limits<float>::quiet_NaN()>1.0f)<<"\n";cout<<(numeric_limits<float>::quiet_NaN()<1.0f)<<"\n";//0有特殊运算定义cout<<(-0.0f<0.0f)<<"\n";return(0);}//编译: g++ -std=c++17 cxx_ex3.cpp
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:21:52

教育领域专属问答机器人:借助lora-scripts训练垂直领域LLM模型

教育领域专属问答机器人&#xff1a;借助lora-scripts训练垂直领域LLM模型 在高中物理教研组的办公室里&#xff0c;一位老师正为如何快速响应学生反复提问“匀变速运动怎么算时间”而发愁。这类问题虽基础&#xff0c;却占据了大量答疑时间。如果能让AI学会用标准解题步骤作答…

作者头像 李华
网站建设 2026/6/10 12:52:24

lora-scripts中文文档建设进展:本地化翻译志愿者招募

LoRA 训练自动化新范式&#xff1a;lora-scripts 中文文档共建启动 在生成式 AI 流行的今天&#xff0c;越来越多开发者希望基于 Stable Diffusion 或大语言模型&#xff08;LLM&#xff09;定制专属能力——无论是打造个人艺术风格、训练行业知识问答机器人&#xff0c;还是为…

作者头像 李华
网站建设 2026/6/10 15:57:50

从G1到ZGC的平滑迁移指南:避免内存爆炸的7个关键步骤

第一章&#xff1a;ZGC内存管理优化的核心价值ZGC&#xff08;Z Garbage Collector&#xff09;是JDK 11中引入的低延迟垃圾收集器&#xff0c;专为处理超大堆内存&#xff08;TB级&#xff09;和极短停顿时间&#xff08;小于10ms&#xff09;而设计。其核心价值在于通过着色指…

作者头像 李华
网站建设 2026/6/10 9:58:38

screen+ 基础命令配置:小白也能懂的操作指南

用好screen&#xff0c;告别断连焦虑&#xff1a;工程师的终端守护神你有没有过这样的经历&#xff1f;深夜调试服务器上的数据采集脚本&#xff0c;眼看着进度条走到90%&#xff0c;突然Wi-Fi抽风、SSH断开——再连上去时&#xff0c;进程早已消失无踪。或者在远程烧录嵌入式设…

作者头像 李华
网站建设 2026/6/10 12:58:42

七牛云CDN加速lora-scripts网站图片与视频加载

七牛云CDN加速lora-scripts网站图片与视频加载 在AI生成内容&#xff08;AIGC&#xff09;快速普及的今天&#xff0c;越来越多开发者希望通过LoRA技术对Stable Diffusion或大语言模型进行个性化微调。而像lora-scripts这样的自动化训练工具&#xff0c;正让这一过程变得前所未…

作者头像 李华
网站建设 2026/6/10 12:49:58

使用lora-scripts进行短视频素材生成:创意产业新机遇

使用lora-scripts进行短视频素材生成&#xff1a;创意产业新机遇 在短视频内容爆炸式增长的今天&#xff0c;创作者和品牌方面临一个共同难题&#xff1a;如何在保持风格统一的前提下&#xff0c;持续产出高质量、高辨识度的视觉与文本素材&#xff1f;传统制作流程依赖人工设…

作者头像 李华