IEEE754标准的c语言阐述,以及几个浮点数常量

很多年前,调研过浮点数与整数之间的双射问题:
win7 intel x64 cpu vs2013 c语言浮点数精度失真问题

最近重新学习了一下IEEE754标准,也许实际还有很多深刻问题没有被揭示。
计算机程序设计艺术,据说这本书中也有讨论。

参考:https://upimg.baike.so.com/doc/643382-681042.html
在这里插入图片描述
float32在线测试页面 :https://www.h-schmidt.net/FloatConverter/IEEE754.html
在这里插入图片描述
我用手写计算的方式,算过一遍之后,得到一个结论:
任意数值的32bit,对应的float,都可以被精确地计算,转换为一个无误差对应的字符串,且与printf %.Nf一致,只要N足够大。
eg:float FLT_TRUE_MIN == 0x00000001, 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125 (149位小数)
所有其他float都是FLT_TRUE_MIN这个数的整数倍。
稍微计算几个值就明白为什么。fraction中第一个1代表0.5,第二个1是0.25,然后是0.125,0.0625,0.03125 …尾数一直可以被2整除。题外话,如果是前苏联的3进制计算机,可能就存在无限循环除不尽的问题。

但是,前面提过,float与u32的双射问题。
显然32bit最多只有4,294,967,295个值。
u32只有10位十进制数,与149位十进制小数到FLT_MAX(340282346638528859811704183484516925440.000000)是无法一一对应的。
那么中间,绝大多数的浮点数数值都没有32bit的对应值,也就是说,人工随便写的一个浮点数字符串,有99%以上的概率转换为float之后,再转换为string,是无法还原的!
但是,c基础库的printf %f和atof有一种不失真、可逆的转换实现!只是这种实现是从32bit到float string,再还原到32bit。
人为造假float值比较容易被识别,只要是不可逆的就一定是人为改过的!

个人觉得IEEE754标准的设计,c语言的实现,并不是看起来那么简单。
稍微提几个方面:硬件电路、编译器、累计误差…这些方面的坑感觉都很深。

下面是个人测试float的代码及测试结果:

#include <stdio.h>
#include <float.h>
#include <math.h>
union u32f32 {unsigned int u32;float f32;struct {unsigned int fraction : 23;unsigned int exp : 8;unsigned int sign : 1;};
};
static char c_u32[64] = { 0 };
static char c_sign[64] = { 0 };
static char c_exp[64] = { 0 };
static char c_fraction[64] = { 0 };
void to_binary_string_with_spaces(const unsigned int u32, const int bits, char c_temp[64]) {int valid_bits = bits <= 32 ? bits : 32;int char_index = 0;for (int i = valid_bits - 1; i >= 0; i--) {if (i % 4 == 3 && i != valid_bits - 1) {c_temp[char_index++] = ' ';}c_temp[char_index++] = (u32 & (1U << i)) ? '1' : '0';}c_temp[char_index] = '\0';
}
void print_float_binary(const char* p_name, const unsigned int i) {const union u32f32 u32_f32_obj = { .u32 = i };to_binary_string_with_spaces(u32_f32_obj.u32, 32, c_u32);to_binary_string_with_spaces(u32_f32_obj.sign, 1, c_sign);to_binary_string_with_spaces(u32_f32_obj.exp, 8, c_exp);to_binary_string_with_spaces(u32_f32_obj.fraction, 23, c_fraction);printf("float %s == 0x%08x, binary(%s)\n", p_name, u32_f32_obj.u32, c_u32);printf("float %s == 0x%08x, sign(%s)*(-1) 2^exp(%s-127) fraction(1.%s)\n",p_name, u32_f32_obj.u32, c_sign, c_exp, c_fraction);
}
int test_float() {union u32f32 u32_f32_max_obj = { .f32 = FLT_MAX };//3.402823466e+38Funion u32f32 u32_f32_epsilon_obj = { .f32 = FLT_EPSILON };//1.192092896e-07Funion u32f32 u32_f32_min_obj = { .f32 = FLT_MIN };//1.175494351e-38Funion u32f32 u32_f32_true_min_obj = { .f32 = FLT_TRUE_MIN };//1.401298464e-45Funion u32f32 u32_f32_NaN_obj = { .f32 = NAN };//nanunion u32f32 u32_f32_inf_obj = { .f32 = INFINITY };union u32f32 u32_f32_ne_inf_obj = { .f32 = -INFINITY };union u32f32 u32_f32_0_obj = { .f32 = 0 };union u32f32 u32_f32_ne_0_obj = { .f32 = 0,.sign = 1 };printf("float FLT_MAX      == 0x%08x, %f\n", u32_f32_max_obj.u32, u32_f32_max_obj.f32);printf("float FLT_EPSILON  == 0x%08x, %.23f\n", u32_f32_epsilon_obj.u32, u32_f32_epsilon_obj.f32);printf("float FLT_MIN      == 0x%08x, %.126f\n", u32_f32_min_obj.u32, u32_f32_min_obj.f32);printf("float FLT_TRUE_MIN == 0x%08x, %.149f\n", u32_f32_true_min_obj.u32, u32_f32_true_min_obj.f32);printf("float NaN          == 0x%08x, %f\n", u32_f32_NaN_obj.u32, u32_f32_NaN_obj.f32);printf("float INFINITY     == 0x%08x, %f\n", u32_f32_inf_obj.u32, u32_f32_inf_obj.f32);printf("float -INFINITY    == 0x%08x, %f\n", u32_f32_ne_inf_obj.u32, u32_f32_ne_inf_obj.f32);printf("float +0           == 0x%08x, %f\n", u32_f32_0_obj.u32, u32_f32_0_obj.f32);printf("float -0           == 0x%08x, %f\n", u32_f32_ne_0_obj.u32, u32_f32_ne_0_obj.f32);//print_float_binary("FLT_MAX     ", u32_f32_max_obj.u32);print_float_binary("FLT_EPSILON ", u32_f32_epsilon_obj.u32);print_float_binary("FLT_MIN     ", u32_f32_min_obj.u32);print_float_binary("FLT_TRUE_MIN", u32_f32_true_min_obj.u32);print_float_binary("NaN         ", u32_f32_NaN_obj.u32);print_float_binary("INFINITY    ", u32_f32_inf_obj.u32);print_float_binary("-INFINITY   ", u32_f32_ne_inf_obj.u32);print_float_binary("zero(+0)    ", u32_f32_0_obj.u32);print_float_binary("zero(-0)    ", u32_f32_ne_0_obj.u32);//union u32f32 u32_f32_obj = { .u32 = 0xBCD3D6D8 };//0xBCD3D6D8 == -0.02585928142070770263671875printf("float obj_test     == 0x%08x, %.60f\n", u32_f32_obj.u32, u32_f32_obj.f32);print_float_binary("obj_test    ", u32_f32_obj.u32);//printf("float obj_test     == 0x%08x, sign(%s1) 2^exp(%d) fraction(%.30f)\n", u32_f32_obj.u32,u32_f32_obj.sign ? "-" : "+",((int)u32_f32_obj.exp) - 127,1.0 * u32_f32_obj.fraction / (1 << 23) + 1);printf("float obj_test     == 0x%08x, sign(%d) exp(%f) fraction(%.30f)\n", u32_f32_obj.u32,(-1) * (int)u32_f32_obj.sign,(pow(2, ((int)u32_f32_obj.exp) - 127)),(1.0 * u32_f32_obj.fraction / (1 << 23) + 1));printf("float obj_test     == 0x%08x, %.30f\n", u32_f32_obj.u32,(-1) * (int)u32_f32_obj.sign *(pow(2, ((int)u32_f32_obj.exp) - 127)) *(1.0 * u32_f32_obj.fraction / (1 << 23) + 1));return 0;
}int main(int argc, char** argv) {return test_float();
}
float FLT_MAX      == 0x7f7fffff, 340282346638528859811704183484516925440.000000
float FLT_EPSILON  == 0x34000000, 0.00000011920928955078125
float FLT_MIN      == 0x00800000, 0.000000000000000000000000000000000000011754943508222875079687365372222456778186655567720875215087517062784172594547271728515625
float FLT_TRUE_MIN == 0x00000001, 0.00000000000000000000000000000000000000000000140129846432481707092372958328991613128026194187651577175706828388979108268586060148663818836212158203125
float NaN          == 0x7fc00000, nan
float INFINITY     == 0x7f800000, inf
float -INFINITY    == 0xff800000, -inf
float +0           == 0x00000000, 0.000000
float -0           == 0x80000000, -0.000000
float FLT_MAX      == 0x7f7fffff, binary(0111 1111 0111 1111 1111 1111 1111 1111)
float FLT_MAX      == 0x7f7fffff, sign(0)*(-1) 2^exp(1111 1110-127) fraction(1.111 1111 1111 1111 1111 1111)
float FLT_EPSILON  == 0x34000000, binary(0011 0100 0000 0000 0000 0000 0000 0000)
float FLT_EPSILON  == 0x34000000, sign(0)*(-1) 2^exp(0110 1000-127) fraction(1.000 0000 0000 0000 0000 0000)
float FLT_MIN      == 0x00800000, binary(0000 0000 1000 0000 0000 0000 0000 0000)
float FLT_MIN      == 0x00800000, sign(0)*(-1) 2^exp(0000 0001-127) fraction(1.000 0000 0000 0000 0000 0000)
float FLT_TRUE_MIN == 0x00000001, binary(0000 0000 0000 0000 0000 0000 0000 0001)
float FLT_TRUE_MIN == 0x00000001, sign(0)*(-1) 2^exp(0000 0000-127) fraction(1.000 0000 0000 0000 0000 0001)
float NaN          == 0x7fc00000, binary(0111 1111 1100 0000 0000 0000 0000 0000)
float NaN          == 0x7fc00000, sign(0)*(-1) 2^exp(1111 1111-127) fraction(1.100 0000 0000 0000 0000 0000)
float INFINITY     == 0x7f800000, binary(0111 1111 1000 0000 0000 0000 0000 0000)
float INFINITY     == 0x7f800000, sign(0)*(-1) 2^exp(1111 1111-127) fraction(1.000 0000 0000 0000 0000 0000)
float -INFINITY    == 0xff800000, binary(1111 1111 1000 0000 0000 0000 0000 0000)
float -INFINITY    == 0xff800000, sign(1)*(-1) 2^exp(1111 1111-127) fraction(1.000 0000 0000 0000 0000 0000)
float zero(+0)     == 0x00000000, binary(0000 0000 0000 0000 0000 0000 0000 0000)
float zero(+0)     == 0x00000000, sign(0)*(-1) 2^exp(0000 0000-127) fraction(1.000 0000 0000 0000 0000 0000)
float zero(-0)     == 0x80000000, binary(1000 0000 0000 0000 0000 0000 0000 0000)
float zero(-0)     == 0x80000000, sign(1)*(-1) 2^exp(0000 0000-127) fraction(1.000 0000 0000 0000 0000 0000)
float obj_test     == 0xbcd3d6d8, -0.025859281420707702636718750000000000000000000000000000000000
float obj_test     == 0xbcd3d6d8, binary(1011 1100 1101 0011 1101 0110 1101 1000)
float obj_test     == 0xbcd3d6d8, sign(1)*(-1) 2^exp(0111 1001-127) fraction(1.101 0011 1101 0110 1101 1000)
float obj_test     == 0xbcd3d6d8, sign(-1) 2^exp(-6) fraction(1.654994010925292968750000000000)
float obj_test     == 0xbcd3d6d8, sign(-1) exp(0.015625) fraction(1.654994010925292968750000000000)
float obj_test     == 0xbcd3d6d8, -0.025859281420707702636718750000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/715988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电商数据分析13——电商平台退货率分析与降低策略

目录 写在开头1. 退货率分析的重要性1.1 退货现象的影响1.2 退货数据的收集与分析 2. 数据分析揭示的主要退货原因2.1 产品描述不准确2.2 物流配送问题2.3 产品质量问题 3. 基于数据分析的退货率降低策略3.1 优化产品描述和图片3.2 改进物流配送服务3.3 加强质量控制和售后服务…

抖音视频批量采集软件|视频评论下载工具

在日常工作中&#xff0c;需要频繁下载抖音视频&#xff0c;但逐个复制分享链接下载效率太低&#xff1f;别担心&#xff01;我们推出了一款专业的抖音视频批量采集软件&#xff0c;基于C#开发&#xff0c;满足您的需求&#xff0c;让您通过关键词搜索视频并自动批量抓取&#…

力扣每日一题 受限条件下可到达节点的数目 DFS

Problem: 2368. 受限条件下可到达节点的数目 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 灵神 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) Code class Solution {int ans 0;boolean[] set;List<Integer>[] es;publ…

Unity中URP下实现水体(C#动态生成渐变图)

文章目录 前言一、Shader部分1、申明水渐变图纹理和采样器2、在片元着色器&#xff0c;进行纹理采样&#xff0c;并且输出 二、C#脚本部分1、我们新建一个C#脚本2、我们定义两个变量3、在Start内&#xff0c;new 一个Texture2D(宽&#xff0c;高)4、定义一个Color[宽*高]的颜色…

CCS ‘23 论文清单与摘要

网络安全学术顶会——CCS 23 论文清单与摘要 1、“Get in Researchers; We’re Measuring Reproducibility”: A Reproducibility Study of Machine Learning Papers in Tier 1 Security Conferences 可复现性对科学的进展至关重要&#xff1b;它增强了对看似矛盾结果的信心&…

企微hook源码第二弹

免费的企微框架&#xff0c;可下载测试。 支持文本消息&#xff0c;图片消息&#xff0c;视频消息&#xff0c;文件消息。 有兴趣可以进群交流。649480745&#xff0c;群内不定期开源企微hook源码 接下来就是第二弹的企微hook源码。后续会在群内开源完整源码。

diskMirror-backEnd-spring-boot | diskMirror 后端服务器 SpringBoot 版本!

diskMirror-backEnd-spring-boot 开源技术栏 diskMirror 后端服务器 SpringBoot 版本! 此版本中拓展了 DiskMirrorBackEnd&#xff0c;是一个完全的SpringBoot项目&#xff01; 目录 diskMirror-backEnd-spring-boot 目录我如何使用&#xff1f; 部署与配置我如何使用其中的…

Java+SpringBoot+Vue:志愿服务的数字化之旅

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

理想汽车狂飙18%,造车新势力洗牌

2月27日&#xff0c;#理想汽车狂飙18%#话题冲上热搜&#xff1b;前一日&#xff0c;理想汽车(02015.HK)公布了2023年第四季度及全年财报。尽管其营收净利双增长&#xff0c;但业绩增长背后仍有隐忧。 「不二研究」据其2023年报发现&#xff1a;2023年&#xff0c;理想汽车研发…

24计算机考研调剂 | 北京联合大学

北京联合大学自动驾驶方向招生调剂 考研调剂招生信息 学校:北京联合大学 专业:工学->电子信息->计算机应用技术 工学->计算机科学与技术 年级:2024 招生人数:10 招生状态:正在招生中 联系方式:********* (为保护个人隐私,联系方式仅限APP查看) 补充内容 研究…

【办公类-25-01】20240302 UIBOT上传 ”班级主页-育儿知识(家园小报)“

作品展示&#xff1a; 一、背景需求&#xff1a; 本学期制作了 “育儿知识&#xff08;家园小报&#xff09;”合并A4内容 【办公类-22-08】周计划系列&#xff08;4&#xff09;“育儿知识&#xff08;家园小报&#xff09;“ &#xff08;2024年调整版本&#xff09;-CSDN博…

从图像中提取特征的过程时,一些常用的用于描述的词语

提取&#xff08;Extract&#xff09;&#xff1a; 描述模型从输入数据中获取关键信息或特征的过程。例如&#xff0c;特征提取层可以从原始图像中提取特定的模式或结构。 捕获&#xff08;Capture&#xff09;&#xff1a; 表示模型通过学习能够捕获图像中的关键信息&#xf…

【论文阅读】Usenix Security 2023 你看不见我:对基于激光雷达的自动驾驶汽车驾驶框架的物理移除攻击

文章目录 一.论文信息二.论文内容1.摘要2.引言3.作者贡献4.主要图表5.结论 一.论文信息 论文题目&#xff1a; You Can’t See Me: Physical Removal Attacks on LiDAR-based Autonomous Vehicles Driving Frameworks&#xff08;你看不见我:对基于激光雷达的自动驾驶汽车驾驶…

HCIA-HarmonyOS设备开发V2.0证书

目录 一、不墨迹&#xff0c;上证书二、考试总结三、习题四、知识点五、坚持就有收获 HCIA-HarmonyOS Device Developer V2.0 开发者能力认证考试已通过。 一、不墨迹&#xff0c;上证书 一个多月的努力&#xff0c;验证了自己的学习成果&#xff0c;也认识到自己有待提升之处…

微软AI文生图新突破,用于图像生成的多LoRA组合训练模型Multi-LoRA-Composition

微软近期在文本至图像生成领域取得了一项重要突破&#xff0c;通过引入多重低秩适应&#xff08;LoRA&#xff09;技术&#xff0c;成功地创造出了高度个性化和细节丰富的图像。这一研究不仅为我们带来了全新的图像生成方法&#xff0c;还为我们提供了一种基于GPT-4V的图像质量…

switch开关语句

定义 单条件多分支的开关语句。 格式定义 switch(表达式) { case 常量值1: 若干个语句 break; ... case 常量值n: 若干个语句 break; default: 若干语句 } ★注意★&#xff1a; ① 表达式的值必须与int兼容类型&#xff1a; byte&#xff0c;short&#xff0c;int&#xff…

柔柔弱弱人人人

☞ 通用计算机启动过程 1️⃣一个基础固件&#xff1a;BIOS 一个基础固件&#xff1a;BIOS→基本IO系统&#xff0c;它提供以下功能&#xff1a; 上电后自检功能 Power-On Self-Test&#xff0c;即POST&#xff1a;上电后&#xff0c;识别硬件配置并对其进行自检&#xff0c…

django项目中使用ON DUPLICATE KEY UPDATE 来进行数据库批量插入

如果在遇到property_index字段冲突时更新其他所有字段&#xff0c;使其在ON DUPLICATE KEY UPDATE子句中明确指定除了property_index以外的所有字段应该如何更新。这意味着你需要构建一个更新赋值的列表&#xff0c;其中不包括property_index字段。 from django.db import con…

【RISC-V 指令集】RISC-V DSP 扩展指令集介绍(一)

前言&#xff1a; 本笔记是基于对RISC-V DSP扩展指令集文档总结的&#xff0c;《P-ext-proposal.pdf》文档的关键内容如下&#xff1a; 主要介绍了RISC-V的P扩展指令集及其相关细节。 首先&#xff0c;对P扩展指令进行了概述&#xff0c;并列出了其与其他扩展重复的指令。 …

关于NAT的几种类型

NAT网络地址转换&#xff08;Network Address Translation&#xff09;主要用于解决IP地址不足而提出的&#xff0c;NAT主要有以下几类 1、S-NAT&#xff08;Source Network Address Translation&#xff09;基于源地址的NAT 2、D-NAT&#xff08;Destination Network Addres…