1. 程式人生 > >memset 賦初值為無窮大和無窮小

memset 賦初值為無窮大和無窮小

如果問題中各資料的範圍明確,那麼無窮大的設定不是問題,在不明確的情況下,很多程式設計師都取0x7fffffff作為無窮大,因為這是32-bit int的最大值。如果這個無窮大隻用於一般的比較(比如求最小值時min變數的初值),那麼0x7fffffff確實是一個完美的選擇,但是在更多的情況下,0x7fffffff並不是一個好的選擇。

很多時候我們並不只是單純拿無窮大來作比較,而是會運算後再做比較,例如在大部分最短路徑演算法中都會使用的鬆弛操作: 
if (d[u]+w[u][v] < d[v]) d[v]=d[u]+w[u][v]; 
我們知道如果u,v之間沒有邊,那麼w[u][v]=INF,如果我們的INF取0x7fffffff,那麼d[u]+w[u][v]會溢位而變成負數,我們的鬆弛操作便出錯了,更一般的說,0x7fffffff不能滿足“無窮大加一個有窮的數依然是無窮大”,它變成了一個很小的負數。 
除了要滿足加上一個常數依然是無窮大之外,我們的常量還應該滿足“無窮大加無窮大依然是無窮大”,至少兩個無窮大相加不應該出現災難性的錯誤,這一點上0x7fffffff依然不能滿足我們。 
所以我們需要一個更好的傢伙來頂替0x7fffffff,最嚴謹的辦法當然是對無窮大進行特別處理而不是找一個很大很大的常量來代替它(或者說模擬它),但是這樣會讓我們的程式設計過程變得很麻煩。在我讀過的程式碼中,最精巧的無窮大常量取值是0x3f3f3f3f,我不知道是誰最先開始使用這個精妙的常量來做無窮大,不過我的確是從一位不認識的ACMer(ID:Staginner)的部落格上學到的,他/她的很多程式碼中都使用了這個常量,於是我自己也嘗試了一下,發現非常好用,而當我對這個常量做更深入的分析時,就發現它真的是非常精巧了。

0x3f3f3f3f的十進位制是1061109567,也就是10^9級別的(和0x7fffffff一個數量級),而一般場合下的資料都是小於10^9的,所以它可以作為無窮大使用而不致出現數據大於無窮大的情形。 
另一方面,由於一般的資料都不會大於10^9,所以當我們把無窮大加上一個資料時,它並不會溢位(這就滿足了“無窮大加一個有窮的數依然是無窮大”),事實上0x3f3f3f3f+0x3f3f3f3f=2122219134,這非常大但卻沒有超過32-bit int的表示範圍,所以0x3f3f3f3f還滿足了我們“無窮大加無窮大還是無窮大”的需求。 
最後,0x3f3f3f3f還能給我們帶來一個意想不到的額外好處:如果我們想要將某個陣列清零,我們通常會使用memset(a,0,sizeof(a))這樣的程式碼來實現(方便而高效),但是當我們想將某個陣列全部賦值為無窮大時(例如解決圖論問題時鄰接矩陣的初始化),就不能使用memset函式而得自己寫迴圈了(寫這些不重要的程式碼真的很痛苦),我們知道這是因為memset是按位元組操作的,它能夠對陣列清零是因為0的每個位元組都是0,現在好了,如果我們將無窮大設為0x3f3f3f3f,那麼奇蹟就發生了,0x3f3f3f3f的每個位元組都是0x3f!所以要把一段記憶體全部置為無窮大,我們只需要memset(a,0x3f,sizeof(a))。 
所以在通常的場合下,0x3f3f3f3f真的是一個非常棒的選擇。

其他賦值:
memset(arr,0x7F,sizeof(arr)); //它將arr中的值全部賦為2139062143,這是用memset對int賦值所能達到的最大值
類似的還有:
memset(arr,0x80,sizeof(arr)); //set int to -2139062144
memset(arr,0x7F,sizeof(arr)); //set double to 1.38242e+306
memset(arr,0xFE,sizeof(arr)); //set double to -5.31401e+303

相關推薦

memset 初值無窮大無窮小

如果問題中各資料的範圍明確,那麼無窮大的設定不是問題,在不明確的情況下,很多程式設計師都取0x7fffffff作為無窮大,因為這是32-bit int的最大值。如果這個無窮大隻用於一般的比較(比如求最小值時min變數的初值),那麼0x7fffffff確實是一個完美的選擇

關於memset無窮大無窮小

得到 一半 color 相反數 ems span spa memset set memset(a,127,sizeof(a)); 即得到無窮大。 memset(a,128,sizeof(a)); 即得到無窮小,與上述的值互為相反數。 memset

Spring -09 -在Spring工程 中載入 properties 檔案 -某個屬性添加註解初值

1.在src 下新建 xxx.properties 檔案,不要任意加空格,註明jdbc等標識名!2.在spring 配置檔案中先引入xmlns:context,在下面新增2.1如果需要記載多個配置檔案逗號分割 <context:property-placeholder location="

java中new出來一個物件定義一個物件空有什麼不同

new 一個物件出來,比如SomeClass sc=new SomeClass();這個時候已經為sc這個物件分配了指向 new SomeClass() 所建立的記憶體空間。即對這個物件sc進行了例項化。而SomeClass sc=null,則sc物件未進行例項化,是一個空的物件,未能指向任何記憶體空間。

mysql儲存過程判斷不空,查詢結果值變數

直接看例子,判斷為空是is null delimiter // create procedure proc__pre_activity_scan() begin    declare p_tid int(10);    set @p_tid=(select tid fro

C++中不給變數初值則它的預設值多少?

區域性變數是所謂Auto 變數(包括函式引數)即在函式內部定義的,非static 定義的區域性變數。 Auto 變數的值是程式載入時分配記憶體的遺留資料,然後程式啟動過程中,也會有一些資料,和函式返回地址佔用這些記憶體,並遺留下來,最後才是程式程式碼裡的Auto 變數遺留的值

BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第11章節--OfficeSP解決方式開發集成Apps Office新的App模型

align epo 挑戰 bsp apps rep 過去 content enter BEGINNING SHAREPOINT? 2013 DEVELOPMENT 第11章節--為Office和SP解決方式開發集成Apps Office新的App模型

25_判斷鏈表是否空++求鏈表長度

back eat sem 聲明 ext malloc list() void amp #include<stdio.h> #include<malloc.h> typedef struct Node{ int data;//數據源

yarn架構——本質上是在做解耦 將資源分配應用程序狀態監控兩個功能職責分離RMAM

沒有 占用 業界 imageview 技術分享 其他 而是 基本 mapreduce Hadoop YARN架構解讀 原Mapreduce架構 原理架構圖如下: 圖 1.Hadoop 原 MapReduce 架構 原 MapReduce 程序的流程:首先用戶程

通過pandoc,轉化markdowndocxhtml

pandoc blog cnblogs brush -o doc true .html ocx 轉化為docx pandoc -f markdown -t docx collection.markdown -o api.docx 轉化為html pandoc coll

Mysql varchar 把默認值設置null空的區別

指向 變量 因此 區別 char 轉換 強行 含義 提高 ‘\0‘,這個表示空,需要消耗存儲空間的。NULL,則表示連這個\0都沒有。 NULL,你可以近似理解為變量未賦值(定義了變量,但是未使用,變量不指向具體存儲空間,因此,理論上不消耗存儲空間),同時,它理論上不可

JavaSE8基礎 釋放對象的引用 指向新對象或null

author oid x64 sta nbsp 看書 讀書 eclips 推薦 禮悟:   好好學習多思考,尊師重道存感恩。葉見尋根三二一,江河湖海同一體。 虛懷若谷良心主,願行無悔給最苦。讀書鍛煉強身心,誠勸且行且珍惜。

HTTP ------ connection close keep-alive 的區別

圖片 tcp連接 三次握手 字段 tcp 其它 時代 http 網頁 keep-alive和close這個要從TCP握手講起HTTP請求是基於TCP連接的,TCP的請求會包含(三次握手,中間請求,四次揮手)在HTTP/1.0時代,一個HTTP請求就要三次握手和四次揮手,當一

JavaScript 驗證表單不獲取select下拉列表的值和文本

blog car form 是你 mys 獲取 document options 身份證 1.驗證表單不為空 var hasform = { "Name": "名字", "Id_card": "身份證", "PaySalary": "月工資",

Java中String直接字符串new String的區別 如String str=new String("a")String str = "a"有什麽區別?

this his The tin ase name ++ 常量池 TE 百度的面試官問 String A="ABC"; String B=new String("ABC"); 這兩個值,A,B 是否相等,如果都往HashSet裏面放,能放下嗎? 答:A==B 不等,

通過SmarRefresLayou框架,你520,你願媽媽

亮顯 web前端 提示 裁剪 沒有 集中 模型 安裝 mic 不少國內空間的新手站長,當使用了SSL證書之後,發現瀏覽器有s效果了,但是沒有綠鎖,谷歌瀏覽器提示“您與此網站建立的連接並非完全安全解決” 這種 當軟件實現了新功能後,準備發布版本前,往往需要進行一輪性能測試以確

VC將同一份代碼同時編譯DllExe的方法

導出函數 接口 bool mod spa 新增 arpspoof 配置 影響 開發中經常遇到這樣的情況,需要開發一個某某功能的接口Dll,但是Dll不能直接調試,你至少需要一個Loader 但是Loader和Dll本身不在同一個工程裏,雖然都在本機的話並不影響源碼級調試,

值運算符比較運算符

賦值 比較 技術 什麽 否則 浪費 代碼 lse 運算符和 這裏為什麽把這兩個合起來呢? 因為這兩個東西太簡單了, 一篇一篇寫有點浪費,所以就合起來一起寫了 嗯 第一個.賦值運算符 賦值運算符一個有六個: =,+=,–=,*=,/=,%= 廢話少說,上圖: 運行結果

互融雲區塊鏈電商全程溯源系統:企業消費者解決信任難題!

img 不可 企業 終端 結構 市場價格 vpd type 分布 區塊鏈技術從誕生之初就被給予厚望,不同於虛無縹緲的炒空氣幣,區塊鏈本身就是大有可為的下一代互聯網技術。在所有的場景應用中,溯源防偽被認為是最有前景的,也是巨頭們爭奪區塊鏈技術落地的第一個領域。國內重點城市紛紛

memset

class div 關系 names name bits pan set 事情 比較神奇的事情 可能和二進制有關系吧 #include<bits/stdc++.h> using namespace std; int f[1000]; int main(){