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.pswp.cn/news/715988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715988.shtml
英文地址,請注明出處:http://en.pswp.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…