據說有99%的人都會做錯的面試題

這道題主要考察了面試者對浮點數存儲格式的理解。另外,請不要討論該題本身是否有意義之類的話題。本題只為了測試面試者相關的知識是否掌握,題目本身并沒有實際的意義。

下面有6個浮點類型變量,其中前三個是float類型的,后三個是double類型的。題目的代碼如下:

復制代碼
float f_v1 = 20;
float f_v2 = 20.3;
float f_v3 = 20.5;double d_v1 = 20;
double d_v2 = 20.3;
double d_v3 = 20.5;cout << ((f_v1 == d_v1)?"true":"false") << endl;
cout << ((f_v2 == d_v2)?"true":"false") << endl;
cout << ((f_v3 == d_v3)?"true":"false") << endl;
復制代碼

問題有如下三個:

  1. 本題的運行結果是什么
  2. 請根據本題的運行結果解釋其原因
  3. 如果某個cout語句的輸出結果為false,在不改變變量定義語句的前提下,如何扔棄相等呢?

下面我先簡要說說如何解答本題,最后再給出答案。

? ? ?首先應先了解float和double的存儲方式。這里先拿float為例。float一共占4個字節,共32位。分為3部分:符號位、指數位和尾數位。分別占1位、8位和23位,存儲結構如圖1所示。

                                          圖1

? ? ?其中如果浮點數為正值,符號位為0,否則為1。指數位采用移位存儲,也就是如果表示10^4,需要將4與127(二進制是01111111)相加存入指數位。尾數位決定了float的精度。尾數一共23位,最多可以表示8388607個值,由于沒有到9999999,所以float的精度為6,如果表示的數小于8388608,那么精度可到7位。這也是為什么有的書中說float的精度是6到7位的原因。這里并不是所有的數都能精確到7位。

??? 另外,所謂的精度是指科學計數法E前面的數字的小數個數。例如,1.2345678E10。

這個數用float表示是可以精確到7位,因為2345678小于8388608。如果是1. 9388648E10,那么就只能精確到6位了。

如果理解了這個,還需要了解如何將十進制浮點數轉換為二進制浮點數,別告訴我你不會,如果真不會的話,回大學從念吧。總之,浮點數轉換是分別轉換整數和小數部分。整數部分除2,小數部分乘2。例如,20.5轉換為二進制是10100.1,20.3轉換為二進制如下:

10100.0100110011001...1001

? ? 其中“...”表示1001部分無限循環。也就是說20.3轉換為二進制浮點數是一個而無限循環的二進制浮點數。

最后,需要知道如何用科學計數法表示二進制浮點數(長見識了吧,二進制也可以用科學計數法)。20.5的科學計數法表示是:1.01001E100

20.3的科學計數法表示是:1.0100010011001...E100

現在就可以一個蘿卜一坑個了,將對應的數填入圖1的三個區域吧。

?

? ? 現在將20.5和20.3都存入double類型的變量,就可以一下看出本題的結果了。double占64位,8個字節。符號位占1位,指數位占11位,尾數位占52位。精度是15或16,原理和float一樣。

?

現在公布一下答案:

true

false

true

?

如果還沒理解其中的奧秘,可以看詳細的視頻講解。

本文轉自銀河使者博客園博客,原文鏈接http://www.cnblogs.com/nokiaguy/p/3929587.html如需轉載請自行聯系原作者


銀河使者

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

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

相關文章

php使用mysql5和8的區別_mysql8.0和mysql5.7的區別是什么?

區別&#xff1a;mysql8.0的索引可以被隱藏和顯示&#xff0c;當一個索引隱藏時&#xff0c;他不會被查詢優化器所使用&#xff1b;2、mysql8.0新增了“SET PERSIST”命令&#xff1b;3、從mysql8.0開始&#xff0c;數據庫的缺省編碼將改為utf8mb4&#xff0c;包含了所有emoji字…

mysql pt check sum_percona工具pt-table-checksum

利用pt-table-checksum進行數據庫同步檢查rpm方式#wget percona.com/get/percona-toolkit.rpm源碼方式#wget http://www.percona.com/downloads/percona-toolkit/2.2.1/percona-toolkit-2.2.8.tar.gz#yum install perl perl-CPAN perl-DBD-MySQL perl-Time-HiRes解壓&#xff0…

如何通過BBED找回刪除數據

項目案例&#xff1a;客戶刪除delete了重要數據&#xff0c;無備份&#xff0c;客戶聯系我&#xff0c;要求恢復相應數據。本次通過實驗方式重現客戶現場。備份高于一切&#xff0c;首先備份&#xff0c;再操作 創建表格&#xff1a; create table king(age number,name varcha…

mysql 重置密碼語音_數字語音信號處理學習筆記語音信號的同態處理(2)

5.4 復倒譜和倒譜 定義 設信號x(n)的z變換為X(z) z[x(n)]&#xff0c;其對數為&#xff1a; (1) 那么 的逆z變換可寫成&#xff1a; (2) 取 (1)式則有 (3) 于是式子(2)則可以寫成 (4) 則式子(4)即為信號x(n)的復倒譜 的定義。因為 一般為復數&#xff0c;故稱 為復倒譜。如果對…

NFS 八步神曲

Server:第一步yum install - y nfs*第二步vi /etc/exports第三步/var/testdirs *(rw,all_squash,anonuid99,anongid99,sync)第四步service nfs start第五步chkconfig --level 35 nfs on Client第一步mount 192.168.1.X:/var/www/testdirs /var/www/testdirs第二步vi /et…

mysql權限日志_mysql權限管理、日志管理及常用工具

mysqlbinlog用法如下&#xff1a;mysqbinlog mysql.err 查詢錯誤日志當然可以通過添加參數來查看指定內容,如&#xff1a;mysqlbinlog mysql-bin.000001 -d test 只顯示對test數據庫的二進制日志mysqlbinlog mysql-bin.000001 -o 3 -r result-file 首先忽略前三個操作&…

Juicer.js模板引擎問題

由于jsp中的EL表達式語法和jquery.tmpl十分類似&#xff0c;&#xff0c;所以單純的使用${name}&#xff0c;數據是渲染不上tmpl的. SO.. 要加上轉義: ${${}amount} 或者 \${amount} 轉載于:https://www.cnblogs.com/fighxp/p/7890288.html

python把回車作為輸入_python將回車作為輸入內容的實例

當input輸入內容的時候,許多情況下輸入回車鍵另起一行輸入,但是這時候Pycharm就執行程序,然后結束,導致無法繼續輸入內容。 原因:Python默認遇到回車的時候,輸入結束。所以我們需要更改這個提示符,在遇到其他字符的時候,輸入才結束。 比如有一個任務: 請輸入文件名:憫…

ubuntu下修改時區和時間

applications-Accessories-Time & Date-點下鎖-輸入密碼-把時區改成上海&#xff08;這個要點圖中國與朝鮮之間的彎處才行&#xff0c;寫不生效&#xff09;-Set the time 選Manually-改下時間、日期-直接關閉即可(重啟后依然生效) 注&#xff1a;從電腦上邊的時間處-Time …

python提供了9個基本的數值運算操作符_Python學習筆記(三)Python基本數字類型及其簡單操作(1)...

一、數字類型表示數字或數值的數據類型稱為數字類型,Python語言提供3種數字類型&#xff1a;整數、浮點數和復數&#xff0c;分別對應數學中的整數、實數和復數&#xff0c;下面就一起來了解一下他們吧&#xff01;1.整數類型整數類型與數學中整數的概念一致&#xff0c;整數類…

hdu 5139 數據的離線處理

所謂的數據離線處理&#xff0c;就是將所有的輸入數據全部讀入后&#xff0c;在進行統一的操作&#xff0c;這樣當然有好處&#xff0c;比如讓你算好多數的階層&#xff0c;但是輸入的每個數是沒有順序的&#xff0c;其實跟可以線性的解決&#xff0c;但是由于沒有順序的輸入&a…

vue 后臺返回的文件流進行預覽_vue實現下載文件流完整前后端代碼

這篇文章主要為大家詳細介紹了vue實現下載文件流完整前后端代碼&#xff0c;文中示例代碼介紹的非常詳細&#xff0c;具有一定的參考價值&#xff0c;感興趣的小伙伴們可以參考一下使用Vue時&#xff0c;我們前端如何處理后端返回的文件流首先后端返回流&#xff0c;這里我把流…

OSPF-5類LSA和4類LSA

# 5類LSA &#xff1a;外部路由前綴 ASBR的router_id IOU5#sh ip ospf data extOSPF Router with ID (5.5.5.5) (Process ID 1)Type-5 AS External Link StatesLS age: 71Options: (No TOS-capability, DC, Upward)LS Type: AS External LinkLink State ID: 10.1.55.0 (Extern…

2014年9月計算機二級mysql真題_2017年9月全國計算機二級MySQL考試章節練習題

2017年9月全國計算機二級MySQL考試章節練習題計算機二級考試成績在“及格”&#xff0c;即60~89分者&#xff0c;由教育部考試中心發合格證書&#xff0c;考試成績在“優秀”&#xff0c;即90~100分者&#xff0c;由教育部考試中心發優秀證書。這是小編給大家提供的2017年9月全…

macOS 10.11.* 安裝scrapy

1.安裝brew&#xff0c;然后修改brew源為某高校 2.更新python brew install python 3.安裝pip 4.安裝scrapy&#xff0c;這里肯定會有一個坑&#xff0c;之前在網上看到10.11開啟了什么rootless的東西&#xff0c; 會遇到安裝six失敗&#xff0c;原因是由于系統安裝了six&#…

eclipse使用小技巧

1. eclipse自帶內存監視及回收插件 菜單 Window > Preferences > General > 右邊&#xff0c;把 Show Heap Status 打上勾就會在右下角任務欄顯示內存監視器,并且可以點擊內存回收。 2. http://www.eclipse.org/downloads/3. 摘錄熱鍵篇&#xff1a;Template&#xff…

mysql @ $_mysql常見筆試題

一、Mysql常見筆試題1、Mysql 中有哪幾種鎖&#xff1f;(1)表級鎖&#xff1a;開銷小&#xff0c;加鎖快。不會出現死鎖&#xff0c;鎖定粒度大&#xff0c;發生鎖沖突的概率高&#xff0c;并發度低。(2)行級鎖&#xff1a;開銷大&#xff0c;加鎖慢。會出現死鎖&#xff0c;鎖…

mysql無法與外部健形成約束_MySQL Rails:錯誤:150“外鍵約束不正確”

我試圖遷移我的Rails MySQL數據庫&#xff0c;我收到以下錯誤&#xff1a;ActiveRecord :: StatementInvalid&#xff1a;Mysql2 :: Error&#xff1a;無法創建表development.comments(錯誤&#xff1a;150“外鍵約束形成錯誤”)&#xff1a;CREATE TABLE注釋(id int AUTO_INCR…

按角度構建切變矩陣

切變是坐標系的變換&#xff0c;非均勻的拉伸。切變時候&#xff0c;角度變化&#xff0c;但是面積或體積不變。也可以理解為坐標軸間的角度變化&#xff0c;造成的扭曲。 如下圖&#xff0c;這是x坐標根據y坐標的切變&#xff0c;機器人的y坐標沒有變化&#xff0c;只有x坐標變…

java 語法_Java基礎語法

標識符定義給包,類,方法,變量起名字的符號。組成規則標識符由字母、數字、下劃線、美元符號組成。命名原則:見名知意包名&#xff1a;全部小寫,多級包用.隔開。舉例&#xff1a;com.jourwon類、接口&#xff1a;一個單詞首字母大寫&#xff0c;多個單詞每個單詞的首字母大寫。舉…